评论

收藏

[C++] C语言指针理解(代码+注释)

编程语言 编程语言 发布于:2021-07-06 17:44 | 阅读数:488 | 评论:0

  
要点

  • 整形变量num、指针变量p1在内存中内存示意图
    DSC0000.png

效果图
DSC0001.png


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

代码、注释
#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;
 }
  

  
关注下面的标签,发现更多相似文章