1.int array[5];
arrray += 2; //错误, array是常量指针(int const *array),不能被修改.
C程序中的各个变量的地址与编译后的二进制程序中变量的地址并没有一一按照顺序存储,原因是编译器对程序进行了一定的优化,调整了变量在栈中的存储顺序。
栈的特点:先进后出
32bit:4个字节
64bit:8个字节
表示位置
变量只是一个代号,它的本质是内存。
指针保存的是内存地址。
地址总线有多少位,寻址空间就有多少位。地址总线可以存在多种状态:32根地址总线就有2的32次方个状态。
比如:32位指的是给内存编号只能编到32个二进制位。
十六进制:
二进制:满二进一
堆内存:是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时动态地申请某个大小的内存空间。
栈内存:每一块保留一块堆内存地址,存取速度比堆快,仅次于寄存器,栈数据可以共享,但缺乏灵活性。
内存地址
指针变量的实质:是一个概念也是一个变量,整形指针、字符指针、浮点指针是指针的具体浮现,常量由编译器决定。
指针不是地址,是地址加偏移量。
int* a;这里的a就是代表指针变量(int*),而不是一个整型变量(int)所以a存放的是地址,*a才是地址中存放的值(这里的*与第一行的*不同,这个*是取地址的意思)
用于调试的编译问件:gcc -g 文件名.c -o 文件名.out
调试文件:gdb 文件名.out进入调试状态,
列出当前项目软件源代码:l/list,若显示不完整,直接回车键即可继续显示
设置断点:break 行数
单步调试:start
查看变量的值: p/print 变量名
进行下一步:n
进入某一步中查看,在进行到该步时,:s/step
查看函数堆栈:bt
查看函数堆栈是,查看某一堆栈:f 堆栈行
回车:重复执行上个步骤
指针,本质是一个地址
代表指针的数据本身也有一个地址,但这个没用
给指针赋值的时候,给的是被赋值量的地址
str[3]是字符串第四个字母l,将其改为\0就将字符串结束了。
str在内存存放结束后就是str3开始存放。
str只有6位空间,输入超过六位之后,编译器会将多余的输入从str的地址开始,一直向内存中输入。
c语言的字符串数组,本质是字节数组,存放了很多字节。
str3[]是字符数组,所以str3可以直接作为地址,在scanf语句当中就不用&str3的表达方式了。
"hello"这个字符串有5个字符,字符串结尾还有一个\0,所以一共有6个。
x/6cb:表示向下打印6个字符,用比特为单位。
用scanf输入str2,对其进行改动,不能完成值的更改,因为指针的内容在运行过后,会储存在代码段,无法被更改。