C语言学习笔记(入门篇三)(指针)

何为指针

这里举个例子来说明一下指针的强大之处.

#include<stdio.h>
void main(){
    
    
	const int a=3;
	//这里定义一个const int 变量a 其作用就是锁定a的值使之不可变.
	//比如此时再让a=4就会报错
	a=4;

}

在这里插入图片描述
那么这个时候如果想要区强行更换a的值就必须使用指针.

#include<stdio.h>
void main(){
    
    
	const int a=3;
	int* prt;//创建一个指向int的指针
	//这里定义一个const int 变量a 其作用就是锁定a的值使之不可变.
	//比如此时再让a=4就会报错
	prt=&a;//取地址
	*prt=4;//提取所储存地址内的对应的值并修改为4
	printf("a=%d",a);

}

结果如下:
在这里插入图片描述

内存示意图

为了更好的理解,我们可以画出如下演示图;
在这里插入图片描述
下面可以举个例子看看:

#include<stdio.h>
void main(){
    
    
	int a=3;
	int* prt;
	prt=&a;
	printf("a的值为%d\na的地址为%p\nprt存放的值为%p\nprt的内存地址为%p\nprt所存的地址对应的值为%d",a,&a,prt,&prt,*prt);

}

在这里插入图片描述

指针类型

这个没什么好说的,有几种数据结构,就可以有几种指针.对于一个指针只是一个指向某一个变量地址的工具.这样做的好处是可以在不创建新的变量的情况下,拜托作用域的影响直接对某一变量修改,或者取值,前提时该变量存在,且内存空间未销毁.

int a ----> int* aprt
float b -----> float* b
char c -------> char* c
int arr[100] ----->int* arrprt[100]//数组

指针的加减大小

指针存放的是什么是一个16进制的内存地址,本质上就是一个值加减比较时完全可以的.
在进行说明之前先简单的引入一个整形数组的概念.
整形数组
数组故名思意就是用来存放一组数据的东东,说白了,就是一个列表.只不过在C语言里面这个整形列表上存放的都是整数.

#include<stdio.h>
void main(){
    
    
	int* listprt[5];
	int list[5];//也可以这样定义不指明大小 list[]
	// 可以这样赋值 list[5]={1,2,3,4,5}也可以像下面一样
	int i;
	for(i=0;i<5;i++){
    
    
		list[i]=i;
		listprt[i]=&list[i];
	}//赋值
	
}

对于一个数组其内存分布如下:
在这里插入图片描述

所以当我们要显示数组的值时可以这样

#include<stdio.h>
void main(){
    
    
	int* x;
	int* listprt[5];
	int list[5];//也可以这样定义不指明大小 list[]
	// 可以这样赋值 list[5]={1,2,3,4,5}也可以像下面一样
	int i,j;
	x=&list;
	printf("list的内存地址%p,list的第一个元素的地址%p",x,listprt[0]);
	for(i=0;i<5;i++){
    
    
		list[i]=i;
		listprt[i]=&list[i];
	}//赋值
	for(j=0;j<5;j++){
    
    
		printf("list[i]=%d",*listprt[i]);
	}
	
	
}

也可以这样

	
#include<stdio.h>
void main(){
    
    
	int* listprt[5];
	int list[5];//也可以这样定义不指明大小 list[]
	// 可以这样赋值 list[5]={1,2,3,4,5}也可以像下面一样
	int i,j;
	
	
	for(i=0;i<5;i++){
    
    
		list[i]=i;
		listprt[i]=&list[i];
	}//赋值
	printf("%p,%p\n",&list,listprt[0]);//补充前面说的
	for(j=0;j<5;j++){
    
    
		printf("list[i]=%d\n",*(listprt[0]+j));
	}

}

这里的指针加一或者减去一是指减去几个内存单位以上面为例子假设int占两个字节 p为指针.那么原来假设p为0x11111那么p++就是p+2个字节结果为0x11113同理加2即p+=2此时p为0x11115

二级指针

说白了就是套娃.
下面看一段代码即可;

void main(){
    
    
	int a=4;
	int* p=&a;
	int**mp=&p;//二级指针,三级指针就是 int*** 
	printf("a=%d\np的地址为:%p\np指向的值为:%d,mp的地址是:%p,指向的是%p\na的地址是%p",a,&p,*p,&mp,*mp,&a);
}

结果如下:
在这里插入图片描述
内存示意图如下:
在这里插入图片描述
所以结合此图,三级,四指针都是如此.无限套娃.
此外指针还可以指向函数,也就是函数指针。
这个下节再说。

猜你喜欢

转载自blog.csdn.net/FUTEROX/article/details/109476733