字符数组和字符串指针的定义

今天在看书上的一段代码的时候发现有一段代码有问题,对于那段代码的错误进行一下解释。

并加强一下我们常用的两种定义字符串的方法的一些区别进行一下解释。

书上的错误代码大概如下:

#include<stdio.h>
void copy(char *x,char *y)
{
    for(;*y!=‘\0‘;x++,y++)
       *x=*y;
       *x=‘\0‘;   printf("%s\n",a);
}
int main()
{
    char *a="Hello!";
    char *b="World!";
    copy(a,b);
    return 0;
}

字符数组和字符串指针都可以用来存储字符串。

但是字符数组和字符串有本质的区别。

#include<stdio.h>
int main()
{
    char a[10]="Hello!";
    char *b="world!";
    printf("a=%x\n",a);
    printf("&a[0]=%x\n",&a[0]);
    printf("b=%x\n",b);
    printf("&b=%x\n",&b);
}
a=9ffe40
&a[0]=9ffe40
b=404000
&b=9ffe38

通过输出我们可以看出来字符数组 a 是一个地址 这个地址就是这段字符数组的首地址 &a 和 &a[0] 都是字符数组的首地址。

而字符串指针 指针变量b 是用来存一段字符串的首地址 &b 就是对着这个指针变量中的数据存储的地址了。

我们对于字符数组可以进行单个字符的改变,因为字符数组就是一堆由字符组成的数组,所以我们对其中一个元素进行修改。

但是字符串指针就是将一个字符类型的指针变量指向了一段字符串,这段字符串是存储在静态数据,对于这些已经定义好的常量我们不能进行随意的修改。

char *a="Hello!";

char *a;
a="Hello!";

这两种的定义效果是一样的如果我们分开看就会看的更明白。

字符串指针指向的那一段字符串不能用其他字符串进行替换。

所以说到这里也就明白了书中程序的错误位置和原因了。

*a=*b;
*a=‘\0‘;

这两个语句都是错误的 字符串指针不能通过这种方式进行修改。这明显是一个错误的代码。

为了实现这种效果我可以有很多的写法在这里举几个例子:

#include<stdio.h>
void copy(char *a,char *b)
{
    a=b;
    printf("%s\n",a);
 }
 int main()
 {
     char *x="Hello!";
     char *y="World!";
     copy(x,y);
  }
 

这个例子就是直接把b的地址赋给了a这样 a,b姐都指向了同一个字符串,同样起到了赋值的作用。

#include<stdio.h>
void copy(char a[],char b[])
{
    int i=0;
    for(i=0;i<sizeof(b);i++)
    {
        a[i]=b[i];
    }
    printf("%s\n",a);
 }
 int main()
 {
     char x[]="Hello!";
     char y[]="World!";
     copy(x,y);
  }
 

这个方法就是定义的时候定义字符数组这样就可以实现一个字符一个字符的赋值了。

所以说书上的也不一定都对,编程这种东西永远没有唯一的正确答案,实现一个功能不同的人编都有不同的代码实现的方法也不相同。

所以多动动手,对每一个代码都抱有质疑的态度,没有绝对的权威,去自己摸索更多新的东西这样才能有更大进步,永远踩着别人的脚印走永远不能超过别人。

时间: 2024-10-05 09:43:09

字符数组和字符串指针的定义的相关文章

C语言中字符数组和字符串指针分析

这几天搞Unix上的C程序,里面用到了很多字符数组和字符串指针,我记得在学完C语言后相当一段时间里,对指针这个东西还是模模糊糊,后来工作也没怎么 用到过C,虽然网上这类的文章也有很多,还是决定自己在这做个小总结,也算加深下自己的印象,写了下面的测试程序: #include <stdio.h> int main(int argc, char *argv[]){ char day[15] = "abcdefghijklmn";  char* strTmp = "opq

字符数组与字符串指针

字符数组: 数组名是一个指针常量,不能直接赋值,即 char str[10]; str = "abcd"; 不能出现对数组名的自加或者自减,即str++, str--; 1 //字符数组(C风格字符串) 2 int main(){ 3 char str1[] = "abc"; 4 char str2[] = {'a', 'b', 'c'};//不以空字符结束,产生未定义行为 5 char str3[] = {"abc"}; 6 char str4

c语言字符数组与字符串的使用详解

转自:http://www.jb51.net/article/37456.htm 1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ 'I',' ','a','m',' ',‘h','a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中提供的字符个数大于数组长度,则按语法错误处理:若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' ). 2.

关注C++细节——字面值初始化字符数组及字符串拷贝注意

char carr[] = "author:CSDN-iaccepted"; 此时,carr数组中元素的个数为21,最后一个位置用来存放空字符'\0'. 所以如果写成carr[21] = "author:CSDN-iaccepted";就是错误的. int clen = strlen(carr); int size = sizeof(carr); 这时候得到的clen = 21,size= 22.这就是因为strlen统计串中字符的个数,不计算最后的空字符,但是si

C++基础之字符数组和字符串

无意中发现了一个非常有意思的技术类型小品文系列,通过大牛指导菜鸟的方式,解说讲C++知识,有的非常基础却是开发中easy忽略的地方. [Elminster的专栏] http://blog.csdn.net/Elminster/article/contents [Solmyr 的小品文系列之中的一个:字符串放在哪里? ] http://blog.csdn.net/elminster/article/details/9730 转帖至此,给出链接,原文就不贴了,总结并扩展一下方便以后回想. 字符数组(

C语言学习笔记:19_数组-字符数组与字符串(常用字符串函数)

/* * 19_数组-字符数组与字符串.c * * Created on: 2015年7月7日 * Author: zhong */ #include <stdio.h> #include <stdlib.h> #include <string.h> /** *一:字符数组:就是存放字符的char[]数组 * 由于c语言中没有像java,C#中的String(字符串),只有存放字符 的字符型数组当字符串使用(java中的String类也是对字符数组进行封闭的). * *

C语言字符数组与字符串

5.5.1 字符数组与字符串区别 l  C语言中没有字符串这种数据类型,可以通过char的数组来替代: l  字符串一定是一个char的数组,但char的数组未必是字符串: l  数字0(和字符'\0'等价)结尾的char数组就是一个字符串,但如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的char的数组. 1 #include <stdio.h> 2 3 4 5 int main() 6 7 { 8 9 char c1[] = { 'c', '

关于“C语言中的字符数组和字符串”一些需要注意的基础点

在C语言中,没有类似Java的String类对字符串的处理,字符串的包装可以采用字符数组. 先看字符数组: #include<stdio.h> void main() { char array[] = {'a','b','c'}; int str = sizeof(array)/sizeof(char); printf("%d",str); } 此时的输出结果为:3,即字符数组的长度为3. 下面我们用字符串初始化字符数组,代码如下. #include<stdio.h&

Base64 报错 的解决办法 (Base-64 字符数组或字符串的长度无效。, 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符。)

Base64 报错 的解决办法, 报错如下:1. FormatException: The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or a non-white space character among the padding characters. ]    System.Convert.FromBase64Str