1、指针变量的定义
数据类型* 变量名;
注意事项:
1、在定义指定变量时,*起到标志性的作用, 除此情况以外,所有指针变量前面加*,表示指针指向的内存
2、*指针变量: 可以作左值也可以作右值
3、*指针变量: 本质就是解引用,访问从保存的地址开始,n个连续的内存
4、指针变量要与保存的地址类型匹配, 否则保存地址一点问题都没有,但是通过指针访问数据存在问题
5、不要出现野指针, 如果指针不知道指向哪里,可以指向NULL
6、所有指针变量的大小是一样的, 32位: 4字节 64位:8字节
gdb调试常用指令:
(1)编译 : gcc xx.c -o xx -g
(2)执行: gdb ./xx
(3)gdb内部指令:
r : 运行
b 行号/函数名: 打断点
n : 单步调试
p 变量名: 打印变量数据
q : 退出gdb
l : 查看代码
(1)&a[0] &a[1] .... &a[i] ------》每个元素的起始地址
(2)a a+1 ..... a+i ------>每个元素的起始地址
(3) &a ---》表示数组的起始地址
&a+1 --->偏移一个数组的大小
(4)数组名的含义: 表示数组首元素的起始地址,并且是一个常量,不能被改变的!!!!
1、要将二维数组理解成数组的数组: a表示数组名, 3表示3个元素,而每个元素都是4个元素的整型数组!!
2、a[0] a[1] a[2] ---->表示第1维数组的三个元素
&a[0] &a[1] &a[2] ----> 表示第1维数组每个元素的起始地址,或者理解成每一行的起始地址
a a+1 a+2 ----->表示第1维数组每个元素的起始地址
a[0] :对于第一数组数组来说是第一个元素,但又是一个一维数组, 并且a[0]可以理解为第一行一维数组的数组名!
a[0][0] a[0][1] a[0][2] a[0][3] ----->表示第一行的一维数组每一个元素
&a[0][0] &a[0][1] &a[0][2] &a[0][3] ------>表示第一行一维数组每一个元素的起始地址
a[0] a[0]+1 a[0]+2 a[0]+3 --->表示第一行一维数组每一个元素的起始地址
数组指针: 本质是一个指针变量,保存数组的起始地址
数组指针语法:
每个元素的类型(*p)[元素个数]
int (*p)[8] : 表示p是一个指针变量,保存有8个元素,每个元素是整型的数组的起始地址
p: 是一个数组指针,保存二维数组第一行的起始地址
p+i : 第i+1行的起始地址
*(p+i) :每一行第一个元素的起始地址
*(p+i)+j :每一行每一个元素的起始地址
*(*(p+i)+j) :每一行的每一个元素
指针数组: 本质就是一个数组,每一个元素都是指针类型的!!!