1.字符指针
字符指针可以存一个字符的地址
- 字符串放在表达式中,赋给p的是首字符的地址
- abcdef变成常量字符串,不可修改
- 打印p指针,会从首地址开始打印,打印到\0;
- 可以加上const,限制修改,更安全,防止报错
- 比较的首元素的地址,不会比较元素
- 字符串常量会共用一块空间,即字符串常量池
2.指针数组
是数组,是用来存放指针的数组
地址就是指针,指针就是地址,但数组变量不能和指针变量画等号
- 用一维指针数组模拟二维数组
- 不是二维数组,因为指针数组里面的指针所指的地址不是连续存放的,二维数组里面的元素是连续存放的
- parr[i]代表指针里的地址,+j相当于移动一个地址的空间
- arr3里面存的是指向指针变量的指针
3.数组指针
- 是指针, 是指向数组的指针
- 整型指针 - 指向整型的指针int*
- 字符指针 - 指向字符的指针char*
- p1是指针数组,存放10个int*的数组
- p2是数组指针,p2可以指向一个数组,该数组有10个元素,每个元素是int类型
- 数组名一般代表首元素地址,除了sizeof(arr)和&arr,是整个数组的大小/地址
- &arr和arr[0]在值上相等,前者用首元素地址代指数组地址,在++上,一个加一个地址,一个加整个数组地址
- p2指针里面存放数组,元素个数10个,每个元素的类型是int
- p2指针的类型是int(*)[10]是一个数组指针类型
- 存放指针数组的数组指针和二级指针
- 错误用法,能运行成功但麻烦且没用,数组指针一般用在二维数组中
- 数组名是首元素地址,二维数组的首元素地址是第一行元素即a,第一行的元素地址用第一个元素表示(值相等)
- 要注意区分a和a[0],a是二维数组名,是第一行地址,a[0]是一维数组名,是第一行第一列的地址
- 对a[0]取地址,取到的是二维数组的首地址,值一样,意义不一样
- 对a取地址,取到的假想的三维数组的首地址,同上
- 传过去用数组指针接收,5个元素代表每一行的元素个数
- *p--第一行地址 。*(p+i)--每一行元素地址。
- *(p+i)+j--每一行的每一个地址。*(*(p+i)+j)每个元素
- 可以改成这种形式,也可以改成 *(a[i]+j) 这种形式
- 存放数组指针的数组
- 建一个parr3[10]的数组,每个元素是int(*)[5]的数组指针,本质是数组
4.指针运算
指针运算:
- 在C语言中,指针的算术运算只包括两个相同类型的指针相减以及指针加上或减去一个整数。
设p和q为指针变量
- p-q=p和q之间的数组元素的个数
- 若加上(int )型的强制类型转换
- (int)p - (int) q=指针p与指针q之间的字节数
数组参数、指针参数
1.一维数组传参
- 一维数组传参,参数可以写成数组,也可以写成指针
- arr2是指针数组,传过去的是数组名即首元素地址,是一个指针的地址,可以用二维指针接收
2.二维数组传参
- 二维数组名传过去是首元素地址即第一行的地址,不能放到一级指针里去,它只能存一个元素的地址,需要用数组指针。
- 二级指针里面要存一维指针,第一行地址不是一维指针
3.一级指针传参
4.二级指针传参
- 总结:主要形参和实参的形式相同就行