C语言指针数组问题

我想问一下
char *a={"abc"};

char a[]={"abc"};
2者有什么区别?区别在哪?

我所知道的区别就是:
前者字符串元素不能被进行赋值运算(只能使用它已经初始化后的值,感觉就跟一串常数差不多了),否则会出现错误
而后者可以随意赋值
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-02-08
执行char *a={"abc"};时,编译器先把"abc"放在内存里一个连续的地址内,然后让a指向它们的首地址,也就是'a'的地址.

而char a[]={"abc"};是先开拓一个a[3]的内存(占4字节,包括'\0'),然后把a,b,c存进去追问

但是char a[]={"abc"}; 单独一个a不是也是等于一个指向a[0]的指针么?

追答

单独一个a也指向a[0],但是这个和*a不一样的,单独a是数组名,它不能改变指向,比如a++;就错了,但是*a是可以的

第2个回答  2013-02-08
说几点c语言讲不到的吧。。。

首先 指针a,数组a以及他其中的内容abc,都存放在内存的栈区,然而指针a后面的“abc”都存放在内存的常量区,放在常量区的是不可以修改的。
再其次,a[4]={"abcd"}, 数组名是指向字符首地址的指针,也就是如你所说的,是指向a[0]的。。。
再者,他们说的可修改内容与否,你只需要了解即可,不需要知道为什么,以后会学到的。。
第3个回答  2013-02-08
char *a={"abc"}; a 是指针。
char c[]={"abc"}; c 是数组。
初始化后 sizeof(a) 为 4,strlen(a) 为3。
同样,sizeof(c) 为 4,strlen(c) 为3。

在语句中有时一样,有时不一样。

例如:
char *a={"abc"};
char c[]={"abc"};
char b[]={"123"};
int L;
L = sizeof(a);
printf("a: %d %s\n",L, a);

a=b; // a 允许
L = sizeof(a);
printf("a: %d %s\n",L, a);

L = sizeof(c); // a,c 方法一样
printf("c: %d %s\n",L, c); // a,c 方法一样

// wrong c=b; // c 不允许
strcpy(c,b); // c 只能这样做
L = sizeof(c);
printf("c: %d %s\n",L, c);

注意 a=b; 允许。c=b; 不允许 。 只能 strcpy(c,b);
输出:
a: 4 abc
a: 4 123
c: 4 abc
c: 4 123追问

char c[]={"abc"}; 单独一个c是指向c[0]的指针么?

追答

是的。单独一个c是 &c[0]。不能做“左值”。

本回答被提问者和网友采纳
第4个回答  2013-02-08
第一个是指针
第二个是数组追问

第一个是指针 但是第二个也是指针吧

相似回答