这是学习视频
应该没问题的,你把程序调试到return 0再去打印str和str3的地址,因为你的str3都没初始化系统应该没有给他分配存储空间,程序还没运行到那里你就打印它的地址应该不对,我是这样理解的
查到了
int a[10]; a ,&a和&a[0] 都是分别是什么?先说明a ,&a和&a[0]三个值是的相等哈。
a叫做数组名,是数组首元素的地址,也就是&a[0]的值。像是一个指针类型,是一个int型的指针类型,int *,先理解成指针吧。
&a这才是一个真正的指针,是一个数组指针。是数组的地址。
切记:&a不是指向指针的指针,因为&a和a的值相等,但是*&a和*a的值不相等。*&a和a的值一样,说明*&a仅仅是对这个数组指针进行了取值,取得的是数组的值,即数组首元素的地址,而不是对&a这个地址进行了取值。这个应该是c语言中针对数组指针运算的规定。
这可能是数组和其他变量不同之处
其实吧,给char数组赋值时,是一个char一个char赋的,
虽然规定的是宽度是10,但只是规定了str3最后一个char即str3[9]为'\0',
当我们手工赋值时,赋了一大串的a,如:str3[0]='a',str3[1]='a'...str3[9]='a',str3[10]='a'...,在这里就把str3[9]给改成了'a'
输出时,其实是指针的移动,在没遇到'\0'前是一直不会结束的,在内存中大多数空间都为'\0',所以可以结束输出,即题主所给出的图片所示,
当然,有时候遇到了不是'\0'的,会把它的ascii码输出,如:在这一串a最后下一个字节中存的是'b',而再下一个是'\0'的话,就会输出一大串a加上一个b后结束输出
因为对于%s来说,他是打印一个字符串,那么他总要知道什么时候打印结束吧,所以就以/0为准,看见/0就不打印了
但是对于%c来说,他只负责一个一个把字符打印出来,才不关心什么时候结束呢,让我打印我就打印,所以如你所见,他就可以打印出/0后面的东西
函数的调用时是从高到低分配,形参变量从高到低分配,局部变量是从低到高分配 我也是看别人解释的
我的理解不知道对否,有问题还望提出以便改正。
str(指针常量)的内容是一个固定的地址,而str是这个地址的名字,它被存放在&str下,也就是栈里。即栈里存放的是str,str里存放的是指针常量。
hello是否是常量取决于它赋给谁,赋给字符指针变量时因为没有分配空间所以就会放在常量区当作常量,赋给数组时分配了空间,这个空间是系统在栈里分配的。
前面说错了~~~~~
输入25个a,str也是25个a,如下图:
下图中可以知道,str的在栈中地址是0x7fffffffde00。
当输入25个'a'时,内存中从0x7fffffffde00开始到0x7fffffffde18的25个内存单元中保存的都是输入的'a',在0x7fffffffde19保存的是'\0'。所以输出str时会输出25个'a';
而str3在内存中的地址应该是0x7fffffffde10,由于从0x7fffffffde10到0x7fffffffde18保存了9个'a',在0x7fffffffde19保存的是'\0',所以输出str3时是从str3的地址0x7fffffffde10开始,就只有9个'a'了。
要了解自己申请的空间的大小,避免输入过多超出。添加while限定输入个数。
p str 取出的是str 地址里存放的数据 p *str 取出的 才是首地址
...你看错了
之前的scanf输出到str,这时候才填充到str3
输出八个字符时输出到str3,再往后面就是空的了
不同编译器优化会不同,不必强求跟老师一样,你的str2就没放在代码段,这是编译器优化不同