325
社区成员




AutoLeaders控制组——指针学习笔记
1.定义指针
指针是用于保存地址的变量。
其输入方式为:
这表示为,定义了一个指针变量p且它的值为变量i的地址。
其中*是指让变量p定义为指针变量。
对于输入的特点:
(1)*既可紧贴int又可远离int定义。
(2)无论何种,当同时如图定义变量时,只有p为指针变量而q不是。
(3)指针不止有int类型。
2.指针与函数
1.*是单目运算符,用来访问指针的值所表示的地址上的变量,可以做右值也可以做左值。
如 :可用此方法访问原来的变量i并改变它的值。
同时,此方法可在函数调用中改变值,注意,此时仍满足函数的调用只是传入值而不改变,其原理为传入的值是i的地址,而改变的是i的地址,此时对*p的编辑即为对i的编辑。
2.函数返回多个值,某些值就只能通过指针返回,传入的参数实际上是需要保存带回的结果的变量。
3.指针的应用场景:函数返回运算的状态,结果通过指针返回,常见的套路是让番薯返回特殊的不属于有效范围内的值来表示出错,但是当任何数值都是有效的可能结果是,就得分开返回了。
当除数是0,则返回0表示运算无法进行,如果不是0,则此时的指针即为返回该除法运算的结果。
3.指针与函数
1.函数参数表中的数组实际上是指针,sizeof(a)==sizeof(int*),但是可以用数组的运算符[]进行运算。
2.以下四种函数原型是等价的:
int sum(int *ar,int n);
int sum(int*,int);
int sum(int ar[],int n);
int sum(int [],int);
3.数组变量本身表达地址,所以int a[10];int*p=a; // 无需用&取地址
但是数组的单元表达的是变量,需要用&取地址a==&a[0]
[]运算符可以对数组做,也可以对指针做: p[0]<==>a[0]
*运算符可以对指针做,也可以对数组做:*a=25
数组变量是const的指针,所以不能被赋值
4.指针与const(仅C99)
1.表示一旦得到了某个变量的地址,不能再指向其他变量
int *const q=&i;//q是const
*q=26;//OK
q++;//ERROR
2.表示不能通过这个指针去修改那个变量(并不能是的那个变量成为const)
const int *p=&i;
*p=26;//ERROR (*p)是const
i=26;//OK
p=&j;//OK
5.指针运算
1.给指针+1不是给指针的值+1,而是加一个sizeof(),其中()内为指针类型,给一个指针加1表示要让指针指向下一个变量
int a[10];
int *p=a;
*(p+1)->a[1]
如果指针不是指向一片连续分配的空间,如数组,则这种运算没有意义。
2.两指针相减的值不是两地址的差值,而要再除以它们的类型大小,即sizeof(),表示为两指针内能放几个该类型数据。
3.*p++
取出p所指的那个数据来,完事之后顺便把p移到下一个位置去,*的优先级虽然高,但是没有++高,常用于数组类的连续空间操作,在某些CPU上,这可以直接被翻译成一条汇编指令。
4.0地址:内存中有0地址,但是0地址通常是个不能随便碰的地址,所以你的指针不应该具有0值,因此可以用0地址来表示特殊的事情:返回的指针是无效的,指针没有被真正的初始化(先初始化为0),NULL是一个预定定义的符号,表示0地址,有的编译器不愿意你用0来表示0地址。
5.无论指向什么类型,所有的指针的大小都是一样的,因为都是地址,但是指向不同类型的指针是不能直接互相赋值的,这是为了避免用错指针
6.指针的类型转换:void*表示不知道指向什么东西的指针,计算时与char*相同但不相通,指针也可转换类型:int*p=&i;void*q=(void*)p;这并没有改变p所致的变量的类型,而是让后人用不同的眼光通过p看它所指的变量,不再认为它时int,而是void
6.用指针来做什么
需要传入较大的数据时用作参数,传入数组后对数组做操作,函数返回不止一个结果,需要用函数来修改不止一个变量,永泰申请的内存。