指针
指针
- 基本数据类型作为函数的参数是值传递,在函数中修改形参的值不会影响到外面实参的值;
void change(int value) // int value = 10;
{
value = 55;
printf("我被执行了\n");
}
- 数组作为函数的参数是地址传递,如果是地址传递在函数中修改形参的值会影响到外面实参的值.
void change2(int values[])
{
values[1] = 88;
printf("我被执行了\n");
}
如何定义指针
指针变量:
数据类型 * 变量名称;
数据类型:说明将来指针变量能够保存什么类型的变量的地址;
注意: 指针变量是什么类型,那么将来就只能保存什么类型变量的地址;
例如: 指针变量是int类型,那么将来就只能保存int类型变量的地址;
* : 没有任何特殊含义,仅仅是为了标示这是一个指针变量
变量名称 : 用于区分不同的变量
- 指针就是专门用于保存地址的,指针在64位编译器下占8个字节;指针变量只能存储地址.
int *p; // 指针 , 在64位编译器下占用8个字节
p = # // 将num的地址存储到p这个指针中
//指针变量前的*号代表访问指针变量指向的那一块存储空间,*p == num
- 例:自定义函数,要求输入三个值返回他们的和/差与平均值.
int demo(int v1, int v2, int v3, int *p1, int *p2)
{
int sum = v1 + v2 + v3;
*p1 = sum;
int m = v1 - v2 - v3;
*p2 = m;
int average = sum / 3;
return average;
}
- 指针的注意点:
- 1.指针只能保存地址;
- 2.同一个变量可以有多个指针指向它;
- 3.指针的指向可以修改;
- 4.不要访问野指针.(没有赋值的指针, 称之为野指针)
int *p;
int *p = NULL;//在实际开发中,若指针暂时未赋值,建议赋上NULL
printf("%i\n", *p);
- 5.指针类型是什么类型, 就只能指向什么类型的数据;
多级指针
char **charValuePP;
1.拷贝需要指向的变量的数据类型和变量名称
2.在数据类型和变量名称之间加上一颗星
3.修改变量名称
char c = 'a';
char *cp;
cp = &c;
char **cpp;
cpp = &cp;
char ***cppp;
cppp = &cpp;
printf("cppp = %c\n", ***cppp);
- 多级指针的操作,最简单的方式,就是通过几颗星来存储,就通过几颗星来访问;
- 还有一种方式就是画图,看图片中有几个箭头,有几个简单就用几颗星来访问.
//*cp == c;
//*cpp == cp;
//**cpp == *(*cpp) == *cp == c
printf("c = %c\n", c);
printf("*cp = %c\n", *cp);
printf("&c = %p\n", &c);
printf("cp = %p\n", cp);
printf("*cpp = %p\n", *cpp);
printf("**cpp = %c\n", **cpp);
- mac系统中的指针无论是什么类型, 几级指针都占用8个字节;
- 指针为什么要分类型呢?因为当我们利用指针去取值的时候,系统就会自动根据指针的类型来确定应该取对少个字节中的值;
int intValue = 1230;
char charValue = '1';
int *charValueP; // 定义的整型数据的指针变量
charValueP = &charValue; //将char型数据的变量地址传给整型数据类型的指针;
printf("%i\n", *charValueP); //取值时系统会按照int型数据取4个字节;
printf("%i\n",0b00000000000001001100111000110001);
版权声明:本文为博主原创文章,未经博主允许不得转载。
posted on 2015-08-31 20:43 TheBlueNight 阅读(168) 评论(0) 编辑 收藏 举报