9.0.0指针
目录
1.作用:
scanf(“%d”,&i)中的&可以让scanf获取变量地址,其中i一定要为变量;
2.输出地址:
输出一个变量地址用%p,只能取变量即使是i++中i为变量也不可以取到地址;
3.变量在内存存放:
变量在内存中先设的变量在上,数组中前面的在下 ;
9.1.2指针
1.作用:
指针变量可以保存地址;
2.表示指针:
通常用p来表示指针,p指向i意思是p的值是i的地址,要养成良好习惯设了指针后先初始他为0;
3.输出:
输出p是地址,输出*p是地址上的值;
4.定义指针:
int* p,q 和int *p,q没有区别,都表示p是一个指针,q是一个整数变量,不论*是靠近int还是p;int *p,*q才表示p和q都是指针变量;输出i的地址如:prinrtf(“%p”,&i),&一定要加;
注意1:普通变量中的值是实际值而指针变量之中的值是一个具有实际值变量的地址;
注意2:当指针作为一个函数的参数时在调用函数时要给这个函数一个地址如:&i。而不是i的具体值;
1.指针访问函数:
a.如果函数的参数拿到的值是一个确定的数而不是一个指针变量那函数只是得到那个变量值而和那个变量没有关系,如果拿到的是一个指针变量就可以访问函数外的那个变量;
b.当函数的参数p得到了i的地址就可以通过*p访问i的实际值;
c.当函数的参数p得到i的地址就可以赋值给*p同时赋给*p的值也会改变i的值;
2.左值:
*左值叫左值是因为赋值左边代表的是值(式子的结果),而不是一个变量;
注意:scanf中取值时没加&如scanf(“%d”,i),编译没报错而运行报错是因为i的值设的是int类型,和地址位数一样,计算机识别不出错误;
9.1.3指针的使用
1.指针的特殊:
a.指针可以交换两个变量地址,而普通变量在函数内交换后和外面没关系;
b.指针在函数中可以返回多个参数值,如果用普通变量就只能返回一个值;
2.返回结果:
函数运算中可能会遇到特殊状态用return返回状态,指针来返回结果,因为可能结果中有-1和0(计算机中一般用-1和0表示运算遇到特殊状态),所以都用指针返回不了;
注意:没有给指针p一个地址来初始化就不可以赋值给他;
9.1.4指针与数组
1.函数中输入数组:
a.数组输入函数时[]里不写数是因为写了也没用,因为数组是一个指针;输出a[]的地址时前面不加&;
b.在函数中参数设为int* a时,可以以a[]数组的形式输送参数,再函数内部也可以以数组运算;
2.输出数组地址:
输出时数组a[]地址时如printf(“%p”,a),后面不加[];
3.在函数原型参数表中:
int sum(int *a,int n)与int sum(int *,int)与 int sum(int a[],int n)与int sum(int [],int)是等价的;
4.数组与指针关系:
数组变量是特殊的指针,数组本身就表达地址,但是数组每个单元是变量输出地址需要&,a的地址等于a[0]的地址;
5.[]运算符:
[]运算符既可以对数组用又可以对指针用;如果一个指针p被赋予一个min的地址,然后又输出*p和p[0]可以发现这两个值一样,p就变成了以他指向的地址的变量为第一个数组变量的数组;
注意1:指针p转成数组后可以以p[0]表示只有一个单元的数组,而普通变量的只有一个变量的数组只能写成a[1]以表示只有一个元素而不可以写成a[0];
注意2:Int *p=a[];*p指向的是数组a的第一个单元;
注意3:*也可以对数组起作用输出*a实际输出的是a[0];
9.1.5指针与const
1.数组是const的指针,如:
a是一个数组,则a不可以被赋值,a[]就相当* const a,是一个常量指针;如果设const int a[]={1,2,3,4,5,6}则说明数组a中元素都变成了const类型,不可以被赋值成为const int变量;
2.指针与const:
a.Int *const q=&