C语言指针深入理解通俗易懂各种案例分析(代码+注释)

要点

  • 整形变量num、指针变量p1在内存中内存示意图
    在这里插入图片描述

效果图

在这里插入图片描述

  • 对于指针变量,我喜欢的理解是:一个存着其他变量的内存地址的变量,或者你也可以理解为是一个指向其他变量地址的东西

代码、注释

#include<stdio.h>
void new_line(){
	//打印使用printf函数,%d输出整数  %s输出字符串  %c 输出字符  %p打印内存地址   %x输出16进制数字   %o输出8进制   如果使用的输出格式定义没定义对有可能造成没有输出
	printf("\n");//打印个换行 
}
int main()
{
	//指针变量也是个变量!!!!!!,只不过里边存的是其他变量的地址,而你要去拿其他变量的内容,就用*星号去取 
	// &的作用是获取这个变量的内存地址,*的作用是先获取这个变量内存中的值,再拿内存地址为我这个值的变量中存的值(*p,首先我拿到我存的值为0xxx,然后我去拿内存地址为0xxx的变量中存的值,也就是拿到了a的值1) 
	//int *p定义了一个指针变量,指针变量也是变量,只不过这个变量p中存的是a的内存地址0xxx,直接打印p打印出的是a的地址0xxx ,要获得a的值则通过*p去获取内存地址为p中所存值(0xxx)的内容 
	int a=1;
	int *p=&a;//分两步写成 int *p;p=&a;也可以 
	printf("%p",&a);//打印a的内存地址 000000000064FE0C
	new_line(); 
	printf("%p",p);//打印p变量中存的值 000000000064FE0C
	new_line(); 
	printf("%d",*p);//*p  *去拿内存地址为p变量中所存地址的变量的值,也就是a中存的值,也就是1 
	new_line(); 
	
	 
	printf("\n--------\n");
	
	//使用字符数组实现字符串  数组的名字或者第一个元素就是这个数组的内存地址 
	char str[]="abcd";//根据上面规则,那么 str或者str[0]就是这个数组的内存地址 
	char *strp=str;//定义一个指针变量,指针变量中存的地址为字符数组str的首地址 
	printf("%p",str);//打印字符数组首地址 000000000064FE00
	new_line(); 
	printf("%p",&str[0]);//打印字符数组第一个元素的地址(也等于首地址) 000000000064FE00
	new_line(); 
	printf("%p",strp);//打印strp这个指针变量中存储的内容,其实就是存的str这个字符数组的内存地址 000000000064FE00
	new_line(); 
	printf("%c",*strp);//利用*去把内存地址为strp中存的值的变量的值取出来,strp这个指针变量中存的是str的内存地址,那*strp就是让我们去取内存地址为str的变量的值,不就是str[0],也就是字符a  
	new_line(); 
	//拓展
	//利用指针,我们可以循环把这个字符数组打印
	while(1){
		if(*strp=='\0')//如果到了\0就是结束了 
		break;
		printf("%c",*strp);//打印现在指针所在的字符 
		strp++;//指针往后移一个变量,由于数组在内存中是连续的,所以可以这样子玩 
	} 
	new_line();
	//二级指针,指针的指针
	int b=3;
	int *p1=&b;//p1变量中存的是b的地址,利用*p1就可以拿到内存地址为b的内存地址的变量中的值,不就是拿b的值,就是3 
	int **p2=&p1;//p2变量中存的是p1这个变量的内存地址,那么我用*p2的时候是去取了内存地址为p1内存地址的变量的值,不就是拿了p1中存的值,而我们要的是3,也就是内存地址为p1这个变量中存的值的变量的地址,那就再用一次*,也就是**p2,最后拿到的就是3 
	printf("b变量的内存地址为:%p",&b);
	new_line();
	printf("b变量的值为:%d",b);
	new_line();
	printf("p1变量的内存地址为:%p",&p1);
	new_line();
	printf("p1变量的值为:%p  其实不就是b变量的内存地址嘛,指针变量,其实就是存着别人内存地址的变量(也可以不存地址存别的)",p1);
	new_line();
	printf("利用星号取源值,*p1得到的值为:%d",*p1);
	new_line();
	printf("p2变量的内存地址为:%p",&p2);
	new_line();
	printf("p2变量的值为:%p  指针p2指向的是p1,当然p2里存的就是p1的内存地址",p2);
	new_line();
	printf("利用星号取源值,*p2变量的值为:%p",*p2);
	new_line();
	printf("利用星号星号取源值,**p2变量的值为:%d",**p2);
	new_line();
	
	//n级指针同理,不赘述 ,反正你就认清楚,指针变量也是个变量,只不过里边存的是其他变量的地址,而你要去拿其他变量的内容,就用*星号 
	return 0;
 } 
posted @ 2020-08-29 23:04  HumorChen99  阅读(10)  评论(0编辑  收藏  举报  来源