C语言问题:我想把一个数组的值复制到一个char指针里面,结果编译可以通过,但是运行不出来
#include<stdio.h>main(){chara[]="abc";char*b="bbb";inti;for(i=0;a[i]!='\0';i++){*(b+i...
#include <stdio.h>
main(){
char a[] = "abc";
char *b = "bbb";
int i;
for(i = 0; a[i] != '\0'; i++){
*(b + i) = a[i];
}
printf("a[]=%s\n",a);
printf("b[]=%s\n",b);
}
按书上的意思:char *b = "bbb";就是把存放“bbb”的字符数组的首地址给char型指针b,但是*(b + i) = a[i];为什么不能赋值呢?请各位高手赐教! 展开
main(){
char a[] = "abc";
char *b = "bbb";
int i;
for(i = 0; a[i] != '\0'; i++){
*(b + i) = a[i];
}
printf("a[]=%s\n",a);
printf("b[]=%s\n",b);
}
按书上的意思:char *b = "bbb";就是把存放“bbb”的字符数组的首地址给char型指针b,但是*(b + i) = a[i];为什么不能赋值呢?请各位高手赐教! 展开
4个回答
展开全部
这样说你就明白了,你有定义b[]这个数组吗?你现在只有一个b指针,指针指向的是内存,而不是说指针里面存这值,这样你明白不?
按你的意思是项把数组a[]里面的字符串通过指针b输出出来,那你的程序就不能这么写了
你要知道其实数组和指针有时候是有一定相似性的,比如说你定义的一维数组a[],你单独拿出a这个在程序中用,那么a就是一个地址,他里面是内存地址名字,而如果你拿a[i]出来用,那么就是取a这个地址中存储的内容来用,比如说是a[0],他里面存的是'a'这个字符,那你用printf("a=%d\n",a[0]);输出的时候就是'a'这个字符,但是你要是这么输出printf("a=%d\n",a);那你输出的就是内存地址了,不一定是什么数可,系统默认32位处理器内存地址是0x00000000~0xFFFFFFFF之间的16进制数表示的内存地址值,像我刚才输出的是整数,那就是10进制的,他会直接读取内存地址地址名转换成十进制输出出来,就是一大长串数字,所以你要项弄懂这个之间的关系,那就把指针懂。
其实指针也就那么回事,指针里面存的是地址,而不是一个数值。而这个地址里面存的才是数值
再来说你那个指针b,你想用b来输出数组a[]里面的字符串,那么就像我上面说的,数组a[]他里面的a就相当于一个指针,指向a[]数组第一个元素首地址的指针,那你只要把你的a这个指针赋给你新建的指针b就可以了。根本用不到什么循环。而你要输出字符串,那么既然现在b所指向的也和a指向的地址相同,那么直接就能输出来。
这是我修改的你看一下
#include <stdio.h>
int main(){
char a[] = "abc";
char *b = "bbb";
b=a;
printf("a[]=%s\n",a);
printf("b[]=%s\n",b);
return 0;
}
按你的意思是项把数组a[]里面的字符串通过指针b输出出来,那你的程序就不能这么写了
你要知道其实数组和指针有时候是有一定相似性的,比如说你定义的一维数组a[],你单独拿出a这个在程序中用,那么a就是一个地址,他里面是内存地址名字,而如果你拿a[i]出来用,那么就是取a这个地址中存储的内容来用,比如说是a[0],他里面存的是'a'这个字符,那你用printf("a=%d\n",a[0]);输出的时候就是'a'这个字符,但是你要是这么输出printf("a=%d\n",a);那你输出的就是内存地址了,不一定是什么数可,系统默认32位处理器内存地址是0x00000000~0xFFFFFFFF之间的16进制数表示的内存地址值,像我刚才输出的是整数,那就是10进制的,他会直接读取内存地址地址名转换成十进制输出出来,就是一大长串数字,所以你要项弄懂这个之间的关系,那就把指针懂。
其实指针也就那么回事,指针里面存的是地址,而不是一个数值。而这个地址里面存的才是数值
再来说你那个指针b,你想用b来输出数组a[]里面的字符串,那么就像我上面说的,数组a[]他里面的a就相当于一个指针,指向a[]数组第一个元素首地址的指针,那你只要把你的a这个指针赋给你新建的指针b就可以了。根本用不到什么循环。而你要输出字符串,那么既然现在b所指向的也和a指向的地址相同,那么直接就能输出来。
这是我修改的你看一下
#include <stdio.h>
int main(){
char a[] = "abc";
char *b = "bbb";
b=a;
printf("a[]=%s\n",a);
printf("b[]=%s\n",b);
return 0;
}
展开全部
先说下c语言里面的赋值问题
char a[] = "abc";
char *b = "bbb";
这两个赋值有很大不同,首先,a的赋值是,系统预编译的时候会先声明一个固定的数组"abc",然后再对a操作,也就是下一步才是声明一个变量a,将数组"abc"赋值给char a[],要注意,数组"abc"是存在的,只不过赋值给了char a[],再来看看b的赋值,首先系统是声明了一个数组 "bbb",要注意, "bbb"是存在的,然后你的*b赋值只是1声明了一个char类型的指针2将 "bbb"的首地址赋值给b,也就是说指针b指向的地址是一个常量
接下来的就好说了,对产量赋值肯定是错误的,因此,*(b + i) = a[i]这个是错误的,因为*(b + i) 这个指向的是一个常量"bbb"
顺道提句,在main函数前面最好加一个int,返回的时候要一个return 0,这样程序会好很多
char a[] = "abc";
char *b = "bbb";
这两个赋值有很大不同,首先,a的赋值是,系统预编译的时候会先声明一个固定的数组"abc",然后再对a操作,也就是下一步才是声明一个变量a,将数组"abc"赋值给char a[],要注意,数组"abc"是存在的,只不过赋值给了char a[],再来看看b的赋值,首先系统是声明了一个数组 "bbb",要注意, "bbb"是存在的,然后你的*b赋值只是1声明了一个char类型的指针2将 "bbb"的首地址赋值给b,也就是说指针b指向的地址是一个常量
接下来的就好说了,对产量赋值肯定是错误的,因此,*(b + i) = a[i]这个是错误的,因为*(b + i) 这个指向的是一个常量"bbb"
顺道提句,在main函数前面最好加一个int,返回的时候要一个return 0,这样程序会好很多
追问
可是书上说是把存放"bbb“的字符数组的首地址赋给b,也就是说b指向这个字符数组啊。
追答
对,b指向的是"bbb"的首地址,在c语言中,"bbb"这类的数组是系统一开始为你申请的,属于常量,是不能改变它的值,所以赋值会出现问题
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
char a[] = "abc";
char *b = "bbb";
他们俩的区别就好比你声明了一个整型变量 i 赋值为 111,声明(事实上不能声明,这里假设)了一个数字 222,你上面 a 相当于这里 i 的地址,b 相当于这里的 222 数字的地址。你现在想通过指针间接引用的方式把 i 的值 *a(111)赋给 *b(222),事实上这是不可能的。虽然这个例子中 i 和 222 都是内存中的一个整型变量,他们就有区别。i 是变量,可以修改,222 则在编译的时候就确定了它是一个常量。这里的 b 所指向的 "bbb" 和例子中的 222 一样属于常量,是不能被修改的。
char *b = "bbb";
他们俩的区别就好比你声明了一个整型变量 i 赋值为 111,声明(事实上不能声明,这里假设)了一个数字 222,你上面 a 相当于这里 i 的地址,b 相当于这里的 222 数字的地址。你现在想通过指针间接引用的方式把 i 的值 *a(111)赋给 *b(222),事实上这是不可能的。虽然这个例子中 i 和 222 都是内存中的一个整型变量,他们就有区别。i 是变量,可以修改,222 则在编译的时候就确定了它是一个常量。这里的 b 所指向的 "bbb" 和例子中的 222 一样属于常量,是不能被修改的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个其实是定义不同引起的,首先要了解的是两句中“abc”以及“bbb”都是存储在只读段的常量字符串。在定义 char a[] = "abc"; 这一句时,程序申请了四个字节,依次把“abc”以及一个结束符复制到这四个字节中,等于是四个连续的字符变量,而char *b = "bbb" 这一句只定义了一个指针变量,保存了只读常量“bbb”的首地址,所以b+1的地址是只读的,不能写
追问
也就是说
(1)char *a;
char b[]="bbb";
a=b;
这样是指向b。
(2)char *a="bbb";
这样是保存bbb的地址,对吧?
追答
是的,1 中a指向的是char b[]数组,数组中存了“bbb”, 相当于b[0]=‘b’,b[1]='b', b[2]=''b.
2 中 指针a 保存的是常“bbb”的首地址,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询