3. C精华——指针一
创始人
2025-05-30 18:23:55
0

  • 认识指针
  • 指针变量
  • 指针类型严格要求
  • 指针的作用
    • 不同函数,可操作同一块内存空间
    • 设置固定地址
  • 一个指针变量指向数组元素
    • 见怪不怪的遍历方式
  • 数组、函数、指针三合一

认识指针

#include 
int main() {int a = 10;// 通过变量名访问内容 printf("a = %d\n",a);// 访问变量地址printf("address:0x%p\n",&a);// 通过地址访问内容;*:表示读取内存中的数据 printf("a = %d\n",*(&a));return 0;
}

指针变量

指针变量就是存放别人地址的变量

#include 
int main() {int a = 10;// 定义指针变量 int *p = &a;printf("a的地址:0x%p\n",&a);printf("p的地址:0x%p\n",p);printf("p的内容:%d\n",*p);	// 通过地址取内容 return 0;
}

指针类型严格要求

p1/p2的地址都相同,因为类型不同,造成指针的偏移量也不同
int类型偏移4个字节,char类型偏移1个字节

#include 
int main() {int a;int *p1 = &a;char *p2 = &a;printf("p1的地址:%p\n",p1);printf("p1偏移后的地址:%p\n",++p1);printf("p2的地址:%p\n",p2);printf("p2偏移后的地址:%p\n",++p2);return 0; 
} 

指针的作用

不同函数,可操作同一块内存空间

功能性函数(changeData)修改指针变量数据,主函数(main)中也会随之发生改变

#include 
void changeData(int *p1,int *p2){int tmp;tmp = *p1;*p1 = *p2;*p2 = tmp;
}int main() {int data1 = 10;int data2 = 20;printf("数据交换前:%d %d\n",data1,data2);changeData(&data1,&data2);printf("数据交换后:%d %d\n",data1,data2);return 0; 
} 

设置固定地址

#include 
int main() {volatile unsigned int *p = (volatile unsigned int*) 0x000000000062FE1B;printf("p的固定地址:0x%p\n",p);return 0; 
} 

一个指针变量指向数组元素

#include 
int main() {int i;int a[5] = {1,2,3,4,5};int *p;p = &a[0]; // 把a[0]的地址赋值给指针p// p = a; 与上行等价:数组首元素地址for(i=0;i<5;i++){printf("%d ",*p++);// *p++:偏移的是一个int型的大小}return 0; 
} 

见怪不怪的遍历方式

第一种:数组地址先偏移,再取内容
第二种:获取指针下标取内容

#include 
int main() {int i;int a[5] = {1,2,3,4,5};int *p;p = a;for(i=0;i<5;i++){// 数组地址先偏移,再取内容 printf("%d ",*(a+i));	}putchar('\n');for(i=0;i<5;i++){// 获取指针下标取内容 printf("%d ",p[i]);}putchar('\n');/** 注意:程序报错!!! 原因:通过数组名的方式“++”,导致地址偏移过度数组名是常量指针a++偏移的是整个数组的大小 for(i=0;i<5;i++){printf("%d ",*(a++));}*/return 0; 
} 

数组、函数、指针三合一

#include 
void initArr(int *p,int len){int i;for(i=0;iprintf("请输入第%d个数据:",i+1);scanf("%d",p++);}
}void printArr1(int *p,int len){int i;for(i=0;iprintf("%d ",*p++);}
}void printArr2(int *p,int len){int i;p+=len-1; // 将地址偏移到数组末尾for(i=0;iprintf("%d ",*p--);}
}int main() {int arr[5];int size = sizeof(arr) / sizeof(int);initArr(arr,size);		// 初始化数组printArr1(arr,size);	// 正序遍历printArr2(arr,size);	// 逆序遍历return 0; 
} 

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...