一、指针基本概念理解
1. & 的含义
即 取地址的运算
2. 指针的定义
指针就是地址的编号,指针变量就是储存指针的变量。
3. * 的含义
-
用 *访问该地址上的变量,可以做左值(写),也可以做右值(读)
-
*是定义指针变量的标志
int i; int *p=&i;(*p为指针变量,p为地址)
4.总结
将地址(用&)传入函数后,可以在函数中更改该地址上的值(用*p)
(之前都是将值赋给新地址上的变量,没有改变原地址上的值)
二 、指针应用场景
1.交换两个变量的值
void swap ( int *pa,int *pb)
{
int t = *pa;
*pa = *pb;
*pb = t;
}
交换了pa,pb地址上的值。
2.函数返回多个值,某些值只能通过指针返回
传入参数实际上是需要保存带回的结果的变量
#include<stdio.h>
void minmax(int a[], int len, int *max, int *min );
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,12,13,16,55,};
int min,max;
minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
printf("min=%d,max=%d\n",min,max);
return 0;
}
void minmax(int a[],int len,int *min,int *max)
{
int i;
*min =*max=a[0];
for(i=1;i<len;i++){
if( a[i]<*min ){
*min=a[i];
}
if( a[i]>*max){
*max=a[i];
}
}
}
同时输出最大值与最小值
3.函数返回运算的状态,函数的结果由指针返回
套路:函数返回特殊值(不属于有效值的数)表示出错:例如 -1,0
#include<stdio.h>
int divide(int a,int b,int *result);
int main(void)
{
int a=5;
int b=2;
int c;
if(divide(a,b,&c)){
printf("%d/%d=%d\n",a,b,c);
}
return 0;
}
int divide(int a,int b,int *result)
{
int ret = 1;
if(b==0) ret = 0;
else{
*result=a/b;
}
return ret;
}
用无效值表示出错,只返回有效值
三、指针与数组
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]
四、指针 与 const
1. 指针是const
表示一旦得到了某个变量的地址,不能再指向其他变量
int *const q = &i; q是const
*q=26; 正确
q++; 错误
因为q指的是对应的那个地址,q 是const ,即q 的地址不能改变
2.所指是const
表示不能通过这个指针去修改那个变量 (并不能使得那个变量成为const)
const int *p = &i;
*p=26; 错误 (*p)是 const
i= 26; 正确
p=&j; 正确
p上的变量值不能通过指针改变,但是p这个地址可以移动
五、指针计算
1,指针加减法
p+1 指针指向下一个单元
*p=0
*(p+n) = ac[ n ];
这里的值为一个数。
2.++ 与 - -
*p++ 先取出p所指的数,再将指针后移一位
3.两指针相减
地址相减=两指针相隔单元数
4.指针比较
即两地址大小比较
5. 0地址(NULL)不能读写,返回指针无效
6.不同类型指针不能相互赋值