-
将str指针往下移了三个,将hello中第二个l替换为\0,将字符串提前结束查看全部
-
int *p=&a:定义的指针p是整型数据,p++之后,p中的地址就会增加4个字节。
这就是指针偏移运算,这种方式比CPU直接取地址效率还要高,所以设计程序都会尽可能地采取这种方式。
p+=3:将指针向下移动3格,如果p是整型,就移动12个字节。(等价于p[3])
数组和指针的本质都是地址,所以*pa=array,相当于将array数组的地址赋值给pa指针,这样pa[1]的功能和array[1]的功能就没有区别了。
数组是指针常量,
指针是指针变量,
指针能实现数组的功能,但是数组不一定能实现指针的功能。
arry+=2会报错查看全部 -
gdb命令:
x/3d 地址:按照十进制d,连续显示3个(3)变量的地址(x),默认间隔为4个空格查看全部 -
“p”是一个地址,则“*p”是到这个地址去取里面的值,“(*p)”表示为一个整体,“(*p)(数据)”若p为代码段,则调用这个函数,传参数"数据"进去
查看全部 -
最下面的内存最先分配
最先分配的栈地址反而更大
栈的特点:先进后出
静态变量不在栈里头,相同变量名称的静态变量分别在两个函数里便为两个不同变量,属于每个函数特有的;
全局变量为所有函数公用的。其地址不变。
一个函数被多次调用时,静态变量指向的还是数据段一个固定的地址;即不同函数的count是不同的count,但同一个函数不管调用多少次count,它指向的都是数据段的某个地址。查看全部 -
无&符,输出变量值
有该符,输出地址
查看全部 -
变量名只是代号,变量的本质是内存;
在标准的C语言中,不允许直接对内存地址进行操作,只能是对操作系统已经分配给的内存空间进行操作。
int *p=&a; p 指针指向的变量地址; *p 指针指向的变量值; &p 指针自己所在的地址。既然一个指针保存的是变量的地址,对32位CPU,地址有4个字节,就需要4个内存单元来存储,所以每次++p在内存里都是跳4格。
函数调用信息保存在栈(stack)中。 int *pa=&a指将a的地址传给pa。因此p pa看到的是a的地址(&a)。 而p &pa才能看到pa本身的地址。查看全部 -
代码段放编译后的程序,数据段放常量、变量,中间的绿色是自由可分配空间。查看全部 -
0x表示十六进制
查看全部 -
加了地址符后的a表示一个地址,*a是去找到该地址下对应的值可以看出0中a为地址,需*a找到对应值
1中a为确切值
查看全部 -
gdb -help完整显示各种用法(gdb)start 开始执行
红框为自动设置的断点为12行处(gdb) p a
分别为printf a 即为输出变量a
(gdb) n
为换到下一行
(gdb) bt 查看函数堆栈
堆栈像书,摞在上面先执行(gdb) f 1
f为切换栈,即切换到栈1
单用change,由于形参,两个函数中a.b不同,无法改变--所以需要指针
查看全部 -
*a 表指针
&a 取地址查看全部 -
注意:这里偏移三格指向arrary[0]是因为中间有一个变量i,然后是b,然后才是array[0],而不是array[1]查看全部
-
指针变量上加*表示:打印其保存的地址指向的值查看全部
-
不带&符号:打印变量里面的值
否则:打印变量的地址查看全部
举报
0/150
提交
取消