指针的操作
操作 | 效果 |
---|---|
ptr=&a | 赋值 需要注意指针的类型和地址的类型需要相同 |
*ptr | 取值 得到指针指向的地址所存储的值 |
&ptr | 取指针的地址 需要存放在**ptr2 这样的类型中 它表示指向指针的指针 |
ptr+1或者ptr++ | 效果等同于指向数组的下一个元素 |
ptr-1或者ptr-- | 效果等于于指向数组的前一个元素 |
ptr2-ptr | 表示两个指针相间隔的元素的数目 |
注意:指针不可以相加 也不能进行乘除运算
利用指针传递数组
- 如果传递的数组是允许改变的 直接利用指针传递即可
- 如果传递的数组是不允许改变的 使用const修饰指针:const int * ptr 这样的话在你试图修改数组的时候 编译器会报错
关于const的其他内容
- const int* ptr
- 表示指向常量的数组
- 允许改变其指向的地址 不允许修改其指向的地址所表示的值
- int* const ptr
- 表示常量类型的指针
- 允许修改器指向的地址所表示的值 但是不允许修改其指向的地址
- 将常量或非常量数据的地址赋给指向常量的指针是合法的 但是将常量数据的地址赋给普通指针是非法的
指针和多维数组
假设有一个二维数组 声明为:int arr[4][2]
- arr == &arr[0]
- arr[0] == &arr[0][0]
- arr的类型为:int (*ptr) [4] 它是指向一个拥有4个int类型大小的数组的指针
- arr[0]的类型为:int *ptr 它是一个指向int类型的指针
- *arr==&arr[0][0] 因为arr存放第一行数组的首地址 对其求值就代表第一行数组 而一个数组代表的是该数组第一个元素的首地址
- **arr == arr[0][0] 两次取值就是取出了数组中的元素的值 所以二维数组名必须取两次值才可以取出数组中存储的元素
注意 把非常量的地址赋给指向常量的指针是允许的 但是当有两层以上的间接运算符的时候 就不再安全了
多维数组作为函数形式参数
需要使用如下形式 void function(int arr[][4]) 第一个方括号代表了这是一个指针