重新学习C语言,整理一篇关于C语言指针的文章是很有必要的。

首先是指针的理解:指针是一个变量,存放内存地址的一个变量。

先由一段代码引出:

#include<stdio.h>#include<stdlib.h>intmain(){intyear=2017;int*prt_year=NULL;prt_year=&year;printf("今年是%d年",*prt_year);return0;}

指针的定义需要借助特殊的符号*:上面代码“int * prt_year = NULL;”可以这样理解“定义一个类型为int的指针prt_year变量”;

指针的内容的赋值,需要借助特殊的符号&:上面代码“prt_year = &year;”可以这样理解 “将指针prt_year指向year或者将year赋值给prt_year这个地址”;

借助下面的图,你可以理解的更加的清楚:

题外话题:地址一般使用16进制的数字表示,可以打印出来:printf("prt_year的地址:%p" , prt_year);,注意每个人打印的地址可能都是不一样的,不要纠结,这个是电脑自动分配的。


引出下一段代码:

#include<stdio.h>#include<stdlib.h>intmain(){intyear=2017;intper_year=2016;int*prt_year=NULL;int*prt_per_year=NULL;prt_year=&year;prt_per_year=&per_year;printf("今年是%d年\n",year);printf("去年是%d年\n",per_year);printf("--------------------------------------------\n");//重点prt_per_year=prt_year;*prt_per_year=2018;printf("今年是%d年\n",year);printf("去年是%d年\n",per_year);return0;}

先看结果如下图:

出现了怪异的结果。显然,指针“prt_per_year”已经不指向"per_year"了,而是指向了"year"。这是因为“prt_per_year = prt_year;”可以理解为 prt_year的地址赋值给prt_per_year,它们两个都指向了year。

有多个指针都是指向同一个地址,这在真正的编程中是不允许的,都是后出Bug都不知道是哪个指针挖的坑。


因为指针和数组结合的比较紧密,So , 先给出一下概念:

①,数组是一组连续的内存空间

②,数组名称就是这个内存空间的首地址

测试效果如下图:

那么,上一段代码先:

#include<stdio.h>#include<stdlib.h>intmain(){system("color1A");intscore[]={98,77,65,32,85};int*prt_score=NULL;prt_score=score;//指向数组的首地址//prt_score=&score[0];//指向数组的首地址//遍历for(inti=0;i<5;i++){//printf("第%d个元素的值为%d\n",i+1,score[i]);printf("第%d个元素的值为%d\n",i+1,*(prt_score+i));//printf("第%d个元素的值为%d\n",i+1,*p++);//=(*p)++}return0;}

解释 : prt_score = score; prt_score = &score[0]; 这2句的效果是一样的,都是指向数组的首地址。

printf("第%d个元素的值为%d \n" , i+1 , score[i]); printf("第%d个元素的值为%d \n" , i+1 , *(prt_score+i)); printf("第%d个元素的值为%d \n" , i+1 , *p++);//=(*p)++ 这3句的执行效果是一样的

结果预览一下 :


ok , 接下来深入二维数组 , 很有意思

#include<stdio.h>#include<stdlib.h>intmain(){system("color1A");intscore[2][3]={1,2,3,4,5,6};for(inti=0;i<2;i++){for(intj=0;j<3;j++){//printf("第%d行第%d列的值为:%d\n",i+1,j+1,score[i][j]);//printf("第%d行第%d列的值为:%d\n",i+1,j+1,*(score[i]+j));printf("第%d行第%d列的值为:%d\n",i+1,j+1,*(*(score+i)+j));}}return0;}

先看下执行的结果:

解释 :

//printf("第%d行 第%d列的值为 : %d\n" , i + 1 , j + 1 , score[i][j]);
//printf("第%d行 第%d列的值为 : %d\n" , i + 1 , j + 1 , *(score[i] + j));
printf("第%d行 第%d列的值为 : %d\n" , i + 1 , j + 1 , *(*(score + i) + j));

这3句的执行效果是一样的,我只说一句 :数组名称就是这个内存空间的首地址