1.简单的定义指针
#include<stdio.h>
int main(){
int a=12;
int *point =&a;
printf("%d\n",*point);
return 0;
}
假设a=15,这个数字15放在内存地址24459963的位置,上面代码中 point 表示a的地址也就是24459963,而*point代表a的值12
2.指针在函数中的使用
#include<stdio.h>
void increment(int *point){
(*point)++;
}
int main(){
int a=10;
increment(&a);
printf("%d\n",a);
return 0;
}
上述代码输出结果是11,在调用函数increment( )时候,函数会新建一个空间是指针point指向这个空间,当函数调用结束后increment()生成的空间被销毁,因此必须指定函数执行结果所在位置,调用函数时候需要&a,得到a的地址,让函数在原来的地址,执行a的内容自加一
常见的错误写法
#include<stdio.h>
void increment(x){
x++;
}
int main(){
int a=10;
increment(a);
printf("%d\n",a);
return 0;
}
上述代码执行结果是10,无法实现a自加一。
3.函数不指定类型的双层指针内容修改
#include<stdio.h>
void mov(int **point,arr[]){
*point=&arr[1];
}
int main(){
int arr[]={
1,2,3,4,5};
int *p=arr[0];
mov(&p,arr);
printf("%d\n",*p);
return 0;
}
上述代码实现在不开辟新的指正情况下让原来指向arr[0]的指针修改为指向arr[1];
对下面这行代码
mov(&p,arr);
此时p是arr[0]的地址,**point可以理解为point->p->arr[0];也就是**(&p),
也就是*(p) 也就是arr[0],调用函数时候*(&p)=&arr[1],也就是 p=&arr[1]
修改了原来p的内容,即将原来arr[0]的地址替换成arr[1]的
4.函数指定类型的指针内容修改
#include<stdio.h>
int* mov(int *point,int arr[]){
point=&arr[1];
return point;
}
int main(){
int arr[]={
1,2,3,4,5};
int *p=arr[0];
p=mov(p,arr);
printf("%d\n",*p);
return 0;
}
由函数前面的 int* 将其定义为int指针,实质是双层指针mov( )函数返回一个地址,将该值赋给p,使得指针*p指向新的值