重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
重新学习C语言,整理一篇关于C语言指针的文章是很有必要的。
十多年的翔安网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都营销网站建设的优势是能够根据用户设备显示端的尺寸不同,自动调整翔安建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“翔安网站设计”,“翔安网站推广”以来,每个客户项目都认真落实执行。
首先是指针的理解:指针是一个变量,存放内存地址的一个变量。
先由一段代码引出:
#include#include int main() { int year = 2017; int * prt_year = NULL; prt_year = &year; printf("今年是%d年",*prt_year); return 0; }
指针的定义需要借助特殊的符号 * :上面代码“int * prt_year = NULL;”可以这样理解“定义一个类型为int的指针prt_year变量”;
指针的内容的赋值,需要借助特殊的符号 & :上面代码“prt_year = &year;”可以这样理解 “将指针prt_year指向year或者将year赋值给prt_year这个地址”;
借助下面的图,你可以理解的更加的清楚:
题外话题:地址一般使用16进制的数字表示,可以打印出来:printf("prt_year的地址:%p" , prt_year);,注意每个人打印的地址可能都是不一样的,不要纠结,这个是电脑自动分配的。
引出下一段代码:
#include#include int main() { int year = 2017; int per_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); return 0; }
先看结果如下图:
出现了怪异的结果。显然,指针“prt_per_year”已经不指向"per_year"了,而是指向了"year"。这是因为“prt_per_year = prt_year;”可以理解为 prt_year的地址赋值给prt_per_year,它们两个都指向了year。
有多个指针都是指向同一个地址,这在真正的编程中是不允许的,都是后出Bug都不知道是哪个指针挖的坑。
因为指针和数组结合的比较紧密,So , 先给出一下概念:
①,数组是一组连续的内存空间
②,数组名称就是这个内存空间的首地址
测试效果如下图:
那么,上一段代码先:
#include#include int main() { system("color 1A"); int score[] = {98,77, 65 , 32 , 85}; int * prt_score = NULL; prt_score = score;//指向数组的首地址 //prt_score = &score[0];//指向数组的首地址 //遍历 for(int i = 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)++ } return 0; }
解释 : 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#include int main() { system("color 1A"); int score[2][3] = {1,2,3,4,5,6}; for( int i = 0 ; i < 2 ; i++) { for(int j = 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)); } } return 0; }
先看下执行的结果:
解释 :
//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句的执行效果是一样的,我只说一句 :数组名称就是这个内存空间的首地址