c语言问题,有关指针数组的问题

c语言问题,有关指针数组的问题1.指针数组会在初始化时自动分配静态内存,而若只定义不初始化,则需要手动开辟内存对么
比如可以char *a[3]={“one”,“two”,“three”},但char *a[3],然后再分别赋值,就需要用malloc或calloc分配动态内存了是么
2.指针字符数组能实现对某个指针指向的字符串的编辑么,比如char *a[3]={“one”,“two”,“three”};
printf(“%c”,*a[0][1])
能输出字母n么

    “指针数组”定义的是“数组”而非“指针”,是说声明了一个存放指针的数组;一旦声明,数组的空间就分配好了,但数组元素并非有效的指针而是机器垃圾值,要对元素赋正确值以后才能使用。char *a[3]={"one","two","three"};意思是:声明一个名为a的字符型指针数组,有3个元素,并同时用常字符串"one"、"two"和"three"的指针(第一个字符的地址,叫这个字符串的指针)依次初始化;就是说这种写法,{}中的3个字符串也同时放在了某个地方且是不可更改的常量,只是把它们的首地址赋给了数组a。前面说了,char *a[3];是数组,已经为a分配了内存,不必用malloc动态分配,写成char *a[3];a[0]="one";a[1]="two";a[2]="thrdee";同样是合法的。

    肯定能编译!通过指针可以实现对它指向的字符串的任何操作。如果有char *a[3]={"one","two","three"};,那么printf("%c\n",a[0][1]);就输出了字符n;*a[0][1]不行,因为[]的优先级比*高,被编译器解释为*(a[0][1]),这就不合法了。

追问

哦哦,上面的懂了,但若用scanf(“/s”,a[])这样输入字符串,会要求手动分配内存,这是为什么呢

追答

是的,但不一定必须手动分配内存。不过我相信你并没有弄清楚来龙去脉——一句话,指针是“编程”用的附加变量,所以指针必须指向有效的目标后才能通过它给目标赋值;仅仅声明的指针,如char *p;,这时p是野指针,通过它赋值,不仅是非法的,而且是危险的,常常会使系统崩溃。scanf("%s",a[]);中如果指针a[]已经正确指向目标了,那就可以这样赋值,如果还没有指向有效的目标,那就不行。而且这种错误不是语法错误而常常编译正确,所以很危险,因为给它赋值不知赋到哪里去了……比如,char a[200],*p=a;scanf("%s",p);是正确的,因为p已经有了正确的目标;但如果char a[200],*p;scanf("%s",p);那就是错误的,因为p是野指针!

追问

上面说先声明后赋值不是合法的么..有点晕😨

追答

你好好看一下指针是啥玩艺!指针必须指向目标后才能使用,没有指向目标的指针叫野指针,通过野指针给“它的目标(本来就没有,是野的)”赋值是错误和危险的。怎么样才能使指针是“有效”的?那就是要给指针赋一个要指向的目标的地址——你不要把这两种“赋值”混为一谈。scanf函数需要的是目标的指针(地址),它赋值是通过指针向目标赋值而不是给指针赋目标的地址值,在scanf中使用的指针必须是事先赋过目标地址值的指针,否则就是通过野指针给目标赋值,是危险的。给你说了,指针是个“附加”变量,必须事先指向具体的目标,才能通过它操作它指向的目标。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-12-28
1,不一定需要,你仍然可以 a[0] = "one"这样
2 a[0][1]即可输出n,前面不必加*追问

哦哦,但int型指针在赋值前就需要分配内存,为什么呢,还有,比如声明char a[10][10]这样的二维数组后后,a[i]能在函数传递参数时当指针数组来用么,还是说想传递指针数组只能char *a[10]这样声明出来呢

追答

char a[10][10]是数组的数组,可以当作数组的指针,它和指针的数组正好是反的。
a[i]的身份是字符数组,可以当作字符指针来用,不能当作指针数组。

"xxx"这样的其实已经已经分配内存了,分配内存不一定是malloc
int a[10]分配内存
int a; 也分配内存

相似回答