社区
C语言
帖子详情
关于数组常量和指针
bluesnail1986
2011-12-24 04:06:55
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
s1是在运行时赋值,而s2是在编译时就确定的,想问问为什么....?谢了先...
...全文
187
15
打赏
收藏
关于数组常量和指针
char s1[] = "aaaaaaaaaaaaaaa"; char *s2 = "bbbbbbbbbbbbbbbbb"; s1是在运行时赋值,而s2是在编译时就确定的,想问问为什么....?谢了先...
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
iamnobody
2011-12-25
打赏
举报
回复
[Quote=引用 9 楼 it_leaf 的回复:]
引用 7 楼 mingliang1212 的回复:
引用 6 楼 it_leaf 的回复:
常量内存区里面的初始化应该是在编译时候做的做的吧,所以说编译的时候只生成代码不合适吧
编译期间只生成代码.绝对不会对内存区初始化.因为程序执行之前是没有拥有任何内存的.甚至代码都不在内码中.只有当操作系统加载了代码,才有可能执行任何操作,包括全局对象的初始化.之类的.
4……
[/Quote]
全局对象的初始化在main函数之前 .
CoolEgos
2011-12-25
打赏
举报
回复
都是赋值吧,赋的内容不同而已
自信男孩
2011-12-25
打赏
举报
回复
常量是不是属于代码段呢?
iamnobody
2011-12-25
打赏
举报
回复
[Quote=引用 14 楼 it_leaf 的回复:]
引用 12 楼 mingliang1212 的回复:
引用 9 楼 it_leaf 的回复:
这种常量字符和全局对象没什么关系吧,全局变量是在运行main函数之前初始化,但是常量字符应该是在运行前就已经在内存里面的
[/Quote]
我只能说....不是....
IT_LEAF
2011-12-25
打赏
举报
回复
[Quote=引用 12 楼 mingliang1212 的回复:]
引用 9 楼 it_leaf 的回复:
引用 7 楼 mingliang1212 的回复:
引用 6 楼 it_leaf 的回复:
常量内存区里面的初始化应该是在编译时候做的做的吧,所以说编译的时候只生成代码不合适吧
编译期间只生成代码.绝对不会对内存区初始化.因为程序执行之前是没有拥有任何内存的.甚至代码都不在内码中.只有当操作系统加载了代码,才有可能执行任何操作,包括……
[/Quote]
这种常量字符和全局对象没什么关系吧,全局变量是在运行main函数之前初始化,但是常量字符应该是在运行前就已经在内存里面的
Moral
2011-12-25
打赏
举报
回复
[Quote=引用 12 楼 mingliang1212 的回复:]
引用 9 楼 it_leaf 的回复:
引用 7 楼 mingliang1212 的回复:
引用 6 楼 it_leaf 的回复:
常量内存区里面的初始化应该是在编译时候做的做的吧,所以说编译的时候只生成代码不合适吧
编译期间只生成代码.绝对不会对内存区初始化.因为程序执行之前是没有拥有任何内存的.甚至代码都不在内码中.只有当操作系统加载了代码,才有可能执行任何操作,包括……
[/Quote]
123
IT_LEAF
2011-12-24
打赏
举报
回复
[Quote=引用 7 楼 mingliang1212 的回复:]
引用 6 楼 it_leaf 的回复:
常量内存区里面的初始化应该是在编译时候做的做的吧,所以说编译的时候只生成代码不合适吧
编译期间只生成代码.绝对不会对内存区初始化.因为程序执行之前是没有拥有任何内存的.甚至代码都不在内码中.只有当操作系统加载了代码,才有可能执行任何操作,包括全局对象的初始化.之类的.
[/Quote]
4: char s1[] = "aaaa";
00401048 mov eax,[string "aaaa" (00431024)]
0040104D mov dword ptr [ebp-8],eax
00401050 mov cl,byte ptr [string "aaaa"+4 (00431028)]
00401056 mov byte ptr [ebp-4],cl
5: char *s2 = "bbbb";
00401059 mov dword ptr [ebp-0Ch],offset string "bbbb" (0043101c)
内存
0043101C 62 62 62 62 bbbb
00431020 00 00 00 00 ....
00431024 61 61 61 61 aaaa
IT_LEAF
2011-12-24
打赏
举报
回复
[Quote=引用 7 楼 mingliang1212 的回复:]
引用 6 楼 it_leaf 的回复:
常量内存区里面的初始化应该是在编译时候做的做的吧,所以说编译的时候只生成代码不合适吧
编译期间只生成代码.绝对不会对内存区初始化.因为程序执行之前是没有拥有任何内存的.甚至代码都不在内码中.只有当操作系统加载了代码,才有可能执行任何操作,包括全局对象的初始化.之类的.
[/Quote]
可是在代码执行main函数之前,我查看的内存时候就已经看得到aaaaaaaa和bbbbbbbb了
iamnobody
2011-12-24
打赏
举报
回复
[Quote=引用 6 楼 it_leaf 的回复:]
常量内存区里面的初始化应该是在编译时候做的做的吧,所以说编译的时候只生成代码不合适吧
[/Quote]
编译期间只生成代码.绝对不会对内存区初始化.因为程序执行之前是没有拥有任何内存的.甚至代码都不在内码中.只有当操作系统加载了代码,才有可能执行任何操作,包括全局对象的初始化.之类的.
IT_LEAF
2011-12-24
打赏
举报
回复
[Quote=引用 3 楼 mingliang1212 的回复:]
引用 2 楼 bluesnail1986 的回复:
引用 1 楼 mingliang1212 的回复:
s1是一个字符串数组,"aaaaaaaa"是这个数组的初始值.所以运行到这里时,要把数组初始化,也就是运行时赋值.
s2是一个char*类型的指针,"bbbbbbb"是在常量区分配好空间的字符串,这种写法的意思是,用该字符串的首元素指针初始化s2.
那在编译阶段,编译器对s……
[/Quote]
常量内存区里面的初始化应该是在编译时候做的做的吧,所以说编译的时候只生成代码不合适吧
Saleayas
2011-12-24
打赏
举报
回复
对于 s1 , 在编译的时候,系统把"aaaaa"这个数据指定了一个符号叫做 s1.
所以 s1 仅仅是一个有意义的符号,她表示 "aaaaa" 这个数据,可以进行很多操作,但是不能给她赋值。
因为符号是没有自己的存放空间的。
对于 s2 , 在编译的时候,系统为她指定了一个位置,所以她又自己的存放空间,这就是变量。
这里需要区别的是 int a; 和 const int a; 的差别。
同时,在编译的时候,编译器为这个变量指定了一个初始值,这个初始值为 "bbbbb" 的缺省符号。
IT_LEAF
2011-12-24
打赏
举报
回复
[Quote=引用楼主 bluesnail1986 的回复:]
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
s1是在运行时赋值,而s2是在编译时就确定的,想问问为什么....?谢了先...
[/Quote]
这种说法不合适的,编译过程都只是在常量存储区存放字符,对s1和s2什么都没做,只是运行时候s1需要把常量存储区中的字符复制到s1说指向的内存也就是栈中,这就是我们常说的赋值,而s2只是被赋值了一个地址
iamnobody
2011-12-24
打赏
举报
回复
[Quote=引用 2 楼 bluesnail1986 的回复:]
引用 1 楼 mingliang1212 的回复:
s1是一个字符串数组,"aaaaaaaa"是这个数组的初始值.所以运行到这里时,要把数组初始化,也就是运行时赋值.
s2是一个char*类型的指针,"bbbbbbb"是在常量区分配好空间的字符串,这种写法的意思是,用该字符串的首元素指针初始化s2.
那在编译阶段,编译器对s1做了什么呢?
[/Quote]
在编译阶段只会生成代码.任何对象都是在运行时才产生的.也就是说编译器什么都不能对s1,s2做.他只能写出代码,告诉计算机执行到这里时对s1,s2做什么.
"aaaaaa","bbbbb"是在常量区的字符串,在开始进入main函数之前已经在内存中了.
然后运行到该语句时就会按我1楼说的那样初始化.
bluesnail1986
2011-12-24
打赏
举报
回复
[Quote=引用 1 楼 mingliang1212 的回复:]
s1是一个字符串数组,"aaaaaaaa"是这个数组的初始值.所以运行到这里时,要把数组初始化,也就是运行时赋值.
s2是一个char*类型的指针,"bbbbbbb"是在常量区分配好空间的字符串,这种写法的意思是,用该字符串的首元素指针初始化s2.
[/Quote]
那在编译阶段,编译器对s1做了什么呢?
iamnobody
2011-12-24
打赏
举报
回复
s1是一个字符串数组,"aaaaaaaa"是这个数组的初始值.所以运行到这里时,要把数组初始化,也就是运行时赋值.
s2是一个char*类型的指针,"bbbbbbb"是在常量区分配好空间的字符串,这种写法的意思是,用该字符串的首元素指针初始化s2.
C语言程序设计(高清PDF)
7.3.2 指向结构体类型
数组
的
指针
的 使用 136 7.4 链表的建立、插入和删除 138 7.4.1 单链表 139 7.4.2 单链表的插入与删除 141 7.5 共用体 149 7.5.1 共用体的定义 149 7.5.2 共用体变量的引用 150 第8章 输入、输出...
数组
指针
和
指针
数组
、
常量
指针
和
指针
常量
概念1:
数组
指针
:指向
数组
的
指针
本质是
指针
数组
指针
:int (*p)[10]
指针
数组
:存放
指针
的
数组
本质是
数组
指针
数组
:int *p [10] ...
常量
指针
:指向的地址可以改变,但指向的内容不能修改,内容的改
指针
数组
、
数组
指针
、
指针
常量
、
常量
指针
、
常量
指针
常量
指针
数组
、
数组
指针
以及
指针
常量
、
常量
指针
、
常量
指针
常量
的区别
数组
指针
和
指针
数组
首先,理解一下
数组
指针
和
指针
数组
这两个名词: “
数组
指针
”和“
指针
数组
”,只要在名词中间加上“的”字,就知道中心了——
数组
的
指针
:是一个
指针
,什么样的
指针
呢?指向
数组
的
指针
。
指针
的
数组
:是一个
数组
...
指针
数组
、
数组
指针
和二维
数组
以及
常量
指针
和
指针
常量
多维
数组
本身是
指针
数组
,多维
数组
首先是
数组
,
数组
的内容是子
数组
的
指针
数组
数组
指针
就是指向
数组
的
指针
~所以在使用多维
数组
时候使用 例如:int (*a)[3]就是指向一个指向二维
数组
的
指针
。
指针
数组
就是
数组
的内容...
C语言
69,373
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章