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

c语言问题,有关指针数组的问题1.指针数组会在初始化时自动分配静态内存,而若只定义不初始化,则需要手动开辟内存对么比如可以char*a[3]={“one”,“two”,“... 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么
展开
 我来答
White_MouseYBZ
2016-12-28 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6667万
展开全部
  1. “指针数组”定义的是“数组”而非“指针”,是说声明了一个存放指针的数组;一旦声明,数组的空间就分配好了,但数组元素并非有效的指针而是机器垃圾值,要对元素赋正确值以后才能使用。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";同样是合法的。

  2. 肯定能编译!通过指针可以实现对它指向的字符串的任何操作。如果有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是野指针!
heptnaol
2016-12-28 · TA获得超过7263个赞
知道大有可为答主
回答量:7120
采纳率:78%
帮助的人:1829万
展开全部
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; 也分配内存
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式