指针
基本数据类型作为函数的参数是值传递,在函数中修改形参的值不会影响到外面实参的值;
void change(int value )
{
value = 55 ;
printf("我被执行了\n" );
}
数组作为函数的参数是地址传递,如果是地址传递在函数中修改形参的值会影响到外面实参的值.
void change2(int values [])
{
values [1 ] = 88 ;
printf ("我被执行了\n" );
}
如何定义指针
指针变量:
数据类型 * 变量名称;
数据类型:说明将来指针变量能够保存什么类型的变量的地址;
注意: 指针变量是什么类型,那么将来就只能保存什么类型变量的地址;
例如: 指针变量是int类型,那么将来就只能保存int类型变量的地址;
* : 没有任何特殊含义,仅仅是为了标示这是一个指针变量
变量名称 : 用于区分不同的变量
指针就是专门用于保存地址的,指针在64位编译器下占8个字节;指针变量只能存储地址.
int *p;
p = #
例:自定义函数,要求输入三个值返回他们的和/差与平均值.
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);