关于C指针的简单用法

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指向新的值

猜你喜欢

转载自blog.csdn.net/weixin_44910502/article/details/114106339