C语言 指针数组的问题

#include<stdio.h>voidmain(){char*str[3]={"abcd","efgi","jklm"};str[0]="Computer";prin... #include<stdio.h>
void main()
{
char *str[3]={"abcd","efgi","jklm"};
str[0]="Computer";
printf("%c\n%s\n",*str[1],str[1]);
*str[1]='E';
*str[2]='J';
for(int i=0;i<3;i++)
printf("%s\n",str[i]);
}
请问
*str[1]='E';
*str[2]='J';
这两行代码为什么是错误的啊
展开
 我来答
White_MouseYBZ
2013-01-27 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6516万
展开全部
用char *str[3]={"abcd","efgi","jklm"}定义的str[3]是3个char*型指针并被初始化为指向3个字符串常量。注意是字符串“常量”,所以你想用 *str[1]='E';和 *str[2]='J';把其中的第一个小写字母改写成大写是不可以的,因为常量字符串是不允许写操作的。但指针不是常指针,可以指向别处,你写成
str[1]=“Efgi";和str[2]=“Jklm";试试,让指针指向另外的常量字符串应该是可以的……
真喜悦之泪
2013-01-27
知道答主
回答量:61
采纳率:0%
帮助的人:31.3万
展开全部
看这个先我对指针的理解用一个例子表示:
#include"stdio.h"
int main()
{
int i=10;
int *j;
j=&i;
printf("%d %d %d %d",&i,i,j,*j);
return 0;
}
可以看出*+一个指针表示指针指的数.
&则表示一个指针的内存空间地址.
#include<stdio.h>
void main()
{
char * str[3]={"abcd","efgi","jklm"};
str[0]="Computer"; printf("%c\n%s\n",*str[0],str[0]);
str[1]="E"; str[2]="J";
for(int i=0;i<3;i++)
printf("%s\n",str[i]);
}
这样一来没有问题. 第一个char *str [3]相当于定义了3个char *变量.
我个人理解char*类似于一个字符串变量,相当于char str[][3](我只是觉得这样好理解,但有实际区别不可这么写.)

然后把字符串str[0]变为COMPUTER之后,*str[0]指向"abcd"中第一个元素的地址,str[0]则表示串abcd.
然后你问的那两地方就好办了。原来的*str[1]='E',*str[1]是不能用的东西,因为对应的空间地址你没有定义.所以强行访问这会有问题.......str[1]="E" 就对了,str[1]是一个char *, 对他赋值得用双引号,表示字符串......
我的理解不一定对,如有不对,求高手斧正.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
叛逆の雪花a9557d2
2013-01-27
知道答主
回答量:42
采纳率:0%
帮助的人:26.1万
展开全部
”abcd“,”efgi“,”jklm“是常量字符串哦亲,存储区不一样,是在文字常量区,这里的内容是不可以改变的~你可以改变str【1】、str【2】的值,让他们指向其他的地址,因为他们只是两个指针变量~。
而现在str【2】和str【2】指向的是”abcd“,”efgi“的地址,这块地址中的内容不能改变~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xoaxa
2013-01-27 · TA获得超过8608个赞
知道大有可为答主
回答量:6415
采纳率:72%
帮助的人:3444万
展开全部
/*
e
efgi
Computer
Efgi
Jklm
Press any key to continue
*/
#include <stdio.h>#include <string.h>
void main() {
char str[][10] = {"abcd","efgi","jklm"};
// 指针个数由初始化时的串个数决定,而每个串的长度由也由初始化时相应串的长度决定,
// 但给定长度必须能够容纳最长的串,所以,初始长度为3是不够的,由于str[0]将要存放串"Computer",
// 所以给定长度为10。
// str[0] = "Computer"; // 字符数组不能直接复制,应使用函数strcpy(str[0],"Computer");
strcpy(str[0],"Computer");
printf("%c\n%s\n",*str[1],str[1]);
*str[1] = 'E';
*str[2] = 'J';
for(int i = 0;i < 3;i++)
printf("%s\n",str[i]);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dashllh
2013-01-27 · TA获得超过1871个赞
知道小有建树答主
回答量:553
采纳率:0%
帮助的人:166万
展开全部
因为
str[1] 和str[2]的类型是指向字符串的指针,而'E'和'J'都是字节数据,因此类型不匹配,不能赋值。你试试:
*str[1]=”E“;
*str[2]=“J”;
双引号和单引号的意义完全不同哈。
更多追问追答
追问
*str[1]='E'; *str[2]='J';
这两条语句哪里有问题啊?str[1]="efgi" *str[1]就是指向'e',而str[2]="jklm" *str[2]就是指向'j'啊 那么,此时我想使用str[1]='E';*str[2]='J';来把"efgi"变成"Efgi" 把"jklm"变成"Jklm"
这就是我的目的
追答
你的基础知识不牢固。
赋值语句的两边必须是同一类型的数据。'E'是字节类型,而str[1]是指向字符串的指针,不能这样用的。你应该去加强一下基础知识。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式