关于C字符数组和指针初始化问题

gsh10zh 2013-08-22 09:51:52
char str[20];
str = "Hello C!";
为什么这种方式不允许?
char str[20] = "Hello C!";
char *str1;
str1 = "Hello C!";
为什么这两种方式又允许?
...全文
409 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
清_水 2013-08-27
  • 打赏
  • 举报
回复
char str[20]; str = "Hello C!"; 为什么这种方式不允许? 1、赋值不是初始化 2、"Hello C!"是一个临时的指针,而str不是指针 只是数值名。 3、指针和数组不是一个东西。指针是指针 数组名还是数组名, 只是用法上有点相似,例如:指针可一 ++ 操作 而数组名不可以,就是这个道理。 所以char str[20];str = "Hello C!";为什么这种方式不允许的 而下面 char str[20] = "Hello C!";这里有C语言可知,这是可行的,语法知识 char *str1; str1 = "Hello C!"; 由上面 1、2、3可知 指针和指针是可以这么操作的。 可懂了? C中一定要搞清楚 指针 和 数组名之间的区别
nevedliu 2013-08-25
  • 打赏
  • 举报
回复
字符数组名相当于一个常指针,常指针是不能直接修改的 指针变量是改变值指向其它地址的
MEH-hz 2013-08-25
  • 打赏
  • 举报
回复
这确实是一个困扰初学者的问题
zachary_1989 2013-08-25
  • 打赏
  • 举报
回复
2楼正解。。。。。
cao_julians 2013-08-24
  • 打赏
  • 举报
回复
引用 楼主 gsh10zh 的回复:
char str[20]; str = "Hello C!"; 为什么这种方式不允许? char str[20] = "Hello C!"; char *str1; str1 = "Hello C!"; 为什么这两种方式又允许?
慢慢来 1。"Hello C!"这个表达式的语句概念是提供了这个字符串的首字符地址----‘H’的指针 2。str是字符数组的名字,它语法概念是数组首元素的地址----由于数组定义完成(程序执行时)后,数组的存储位置是不会改变的,所以数组名是一个指针不变量(指针常量) 3。str1 则很清楚是指针变量 [结论]由赋值表达式构成的语句 X=Y; X是不是要求一定是变量吧? 那么: str="Hello C!"; 即:指针常量=H’的指针 str1="Hello C!" ; 即:指针变量=H’的指针 的区别和正误是不是很清楚了。 另外初始化不是简单地把定义和语句组合在一起,尽管某些场合执行效果相同,但不代表意义完全相同之处。等效与等价的关系哟!
Digital00 2013-08-24
  • 打赏
  • 举报
回复
字符串返回的是地址信息,数组名相当于一个指针地址,所以你明白的
赵4老师 2013-08-23
  • 打赏
  • 举报
回复
“变量赋值”和“变量初始化”不是一回事! “变量赋值”发生在运行期,其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期,其写法遵循初始化列表语法规定。
七擒关羽 2013-08-23
  • 打赏
  • 举报
回复

char str[20];
str = "Hello C!";//error 如果成功,那么造成地址覆盖,那么原先地址丢失,就是内存泄露
char str[20] = "Hello C!";//初始化赋值,解释就我需要申请20个字符,首地址是“Hello C!”首地址
char *str1 =  "Hello C!";//这是指针地址赋值,不是拷贝
//需要区分拷贝与赋值
AnYidan 2013-08-23
  • 打赏
  • 举报
回复
引用 7 楼 lin5161678 的回复:
引用 1 楼 AnYidan 的回复:
字符串常量的底层实现就是指针
是数组而不是指针
表述不清,不能说实现,字符串常量是在常量区存储了字符数组,以'\0'结尾,然后调用时只是调用了指向它的指针
一根烂笔头 2013-08-23
  • 打赏
  • 举报
回复
问题1:数组名不能为左值!即它不是一个变量 问题2:指针变量赋值!
艾薇儿More 2013-08-23
  • 打赏
  • 举报
回复
好好看看数组和指针吧 简单说char *str = “hello c”是字符串常量,存储在数据段内,不会能修改的。 chat str[30]相当于申请了空间,里面可以修改的存储在堆栈区。也就是指针的字符串常量是不可修改的,数组是可修改的
赵4老师 2013-08-23
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
lin5161678 2013-08-23
  • 打赏
  • 举报
回复
引用 4 楼 studyCBC 的回复:

char str[20] = "Hello C!";//初始化赋值,解释就我需要申请20个字符,首地址是“Hello C!”首地址
解释错了 申请20个char的内存 [这时候 内存地址已经确定无法改变] 然后写入数据 Hello C!剩下的全是0 不是"Hello C!"的首地址
lin5161678 2013-08-23
  • 打赏
  • 举报
回复
引用 1 楼 AnYidan 的回复:
字符串常量的底层实现就是指针
是数组而不是指针
max_min_ 2013-08-23
  • 打赏
  • 举报
回复
引用 4 楼 studyCBC 的回复:

char str[20];
str = "Hello C!";//error 如果成功,那么造成地址覆盖,那么原先地址丢失,就是内存泄露
char str[20] = "Hello C!";//初始化赋值,解释就我需要申请20个字符,首地址是“Hello C!”首地址
char *str1 =  "Hello C!";//这是指针地址赋值,不是拷贝
//需要区分拷贝与赋值

char str[20];
str = "Hello C!";//error
这里没有内存泄漏的吧!非法操作吧,"Hello c"在地址在静态区的,str的地址在栈区
later_equals_never 2013-08-22
  • 打赏
  • 举报
回复
虽然都是用=号,但是str = "Hello C!";是赋值操作,而char str[20] = "Hello C!";是初始化操作,数组可以初始化,但不能整体赋值。
max_min_ 2013-08-22
  • 打赏
  • 举报
回复

char str[20];
str = "Hello C!";//字符串赋值操作不可以直接用==
//应该用strncpy/memcpy等函数 

char str[20] = "Hello C!";
//数组初始化,只有初始化时才可以的
char *str1;
str1 = "Hello C!";
//这个是把常量字符串的首地址赋值给str1,地址赋值是可以,通过地址操作
AnYidan 2013-08-22
  • 打赏
  • 举报
回复
赋值不是初始化 字符串常量的底层实现就是指针

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧