C——指针总结

来源:互联网 发布:淘宝搜索模型 编辑:程序博客网 时间:2024/06/07 23:48

1. 介绍

指针是一个值为内存地址的变量

ptr = &var;   //将变量var的地址赋给变量ptr,变量ptr就是指向变量var的指针

而对于ptr和&var来说,ptr是一个变量,&var则是一个常量,变量可以被赋值改变,而常量不可以

2. 获取值

当得到一个指针时,就可以得到这个指针所在的值

var1 = *ptr  //此时var1==var

符号*,叫间接运算符,也叫取值运算符,用于获取指针所指向的地址中存储的值

也就是说,ptr = &varvar1 = *ptrvar1 = var是等效的

3. 特点

  1. 变量的地址通常是变量首字节所在的地址
  2. 对指针加1,等价于对指针的值(指针的值,而不是指针所指向的变量)加上它所指向的对象的字节大小

4. 数组指针

1. 数组名是该数组首元素的地址

arr = &arr[0];

2. 鉴于特点中的第二点,所以对数组指针加1,指针就指向了数组的下一个元素

arr + 2 == &arr[2];      //true&arr[0] + 2 == &arr[2];  //true以上两条语句是等效的

3. 访问数组元素可以采用一下方式

arr[2] == *(arr + 2);arr[0] == *arr;arr[0] == *(&arr[0]);

4. 函数原型声明(参数为数组)

int sum(int *arr, int n);int sum(int *, int);int sum(int arr[], int n);int sum(int [], int);以上四种形式是等价的

5. 函数定义(参数为数组)

int sum(int *arr, int n){    //code}int sum(int arr[], int n){    //code}以上两种形式等价

5. 注意

  1. 不能对未初始化的指针进行取值或赋值
int *ptr;*ptr = 5;

最好不要有以上行为,由于ptr没有被初始化,因此它的值(指针的值是地址,即地址是随机的)是随机的,不知道5会被存储到什么地方,可能无害,也可能会覆盖程序的数据(指向了程序的某个变量的地址),导致程序错误甚至崩溃。

因此,在声明一个指针的同时,最好将其初始化(指明该指针所指向的变量地址)

2.  若不希望函数改变数组,那么就对函数的形参使用const
int sum(const [], int);int sum(const int arr[], int n){    //code}

由于数组通过参数的方式传递给函数进行操作的时候,传递的是数组的地址,因此函数对数组的操作会改变数组的内容。

使用const关键字,就是告诉编译器,函数应当把arr所指向的数组作为包含常量数据的数组对待

==注意:==
这样使用const并不代表原始数组是固定不变的,这只是说明函数在处理数组时,应该把数组当作固定不变的

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 8个月婴幼儿便秘怎么办 1个月婴幼儿便秘怎么办 榨汁后的苹果渣怎么办 宝宝6个月后容易生病怎么办 婴儿头型睡偏了怎么办 6个月婴儿不吃奶怎么办 宝宝秋季腹泻反复发烧怎么办 纯甄过期一个月怎么办 四个月宝宝不吃奶瓶怎么办 四个月宝宝不吃奶粉怎么办 婴儿三四天不大便怎么办 婴儿几天不拉大便怎么办 新生儿6天不拉屎怎么办 孩子10天不大便怎么办 宝宝5天没拉屎怎么办 小孩4-5天不大便怎么办 三个月宝宝睡前哭闹厉害怎么办 新生儿抱着睡放下就醒怎么办 宝宝大运动发育迟缓怎么办 八个月宝宝不会爬怎么办 宝宝竖着抱早了怎么办 孕妇吃的水果少怎么办 6个月宝宝厌奶怎么办 5个月宝宝厌奶怎么办 11个月宝宝厌奶怎么办 母乳宝宝不喝奶粉怎么办 换奶粉不拉大便怎么办 宝宝和妈妈不亲怎么办 冬天榨果汁太凉怎么办 四个月宝宝拉水怎么办 婴儿吃奶吃撑了怎么办 1岁的宝宝腹泻怎么办 一岁宝宝老拉肚子怎么办 一岁宝宝拉肚子怎么办啊 小孩发烧怎么办39度要吃消炎药吗 孩子不爱吃水果蔬菜怎么办 一岁宝宝不吃水果怎么办 一岁宝宝不爱吃水果怎么办 1岁多宝宝不吃水果怎么办 中学生不爱与家长交流怎么办 孩子一直37度多怎么办