博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
指针,c语言的灵魂
阅读量:6764 次
发布时间:2019-06-26

本文共 4003 字,大约阅读时间需要 13 分钟。

指针是一个值为内存地址的变量。

422101-20171201234925995-380852705.png

变量是一块内存空间,指针是变量,是用来存储内存地址的变量。

#include 
#include
int main(){ int num = 9; printf("num变量的地址为:%p\n",&num); // p表示指针占位符 return 0;}

422101-20171202001653933-779517732.png

#include 
#include
int main(){ int num = 9; int * ptr_num = # printf("num变量的地址为:%p\n",ptr_num); // p表示指针占位符 return 0;}

422101-20171202002223120-68238159.png

根据地址,找到空间!然后操作空间!

变量地址也占用空间,只不过占用的不是内存空间,而是寄存器的存储空间。

内存地址实际上是一种偏移量,存储于段寄存器中。内存地址只是一种抽象,不是真正的物理内存地址,而是逻辑地址。由逻辑地址寻找到物理地址需要经过 逻辑地址->线性地址->物理地址 转换过程,而这些过程都是基于寄存器完成的。

#include 
#include
int main(){ int num = 9; int * ptr_num = # * ptr_num = 10; printf("* ptr_num的值为:%d\n",* ptr_num); printf("num的值为:%d\n",num); // p表示指针占位符 return 0;}

指针的类型,跟他所指向的数据结构有关。

基本类型的指针指向基本类型的数据结构。
比如:char * p; int p; float p; double *p;
分别指向的是char, int ,float, double 类型的变量。

#include 
#include
int main(){ int num1 = 1024; int num2 = 2048; int * ptr1; int * ptr2; ptr1 = &num1; ptr2 = &num2; printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1); printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2); // 将变量1的值赋给变量2 num2 = num1; printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1); printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2); *ptr2 = *ptr1; // 等价于 num2 = num1 printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1); printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2); // 地址变了,num1,num2不受影响 ptr2 = ptr1; printf("num1的值是%d\tnum1的地址是:%p\n",num1,ptr1); printf("num2的值是%d\tnum2的地址是:%p\n",num2,ptr2); return 0;}

一个变量就是一个内存空间,内存一定是有物理地址的!指针就是保存变量内存物理地址的变量!

指针与数组

数组是一个连续的内存空间,数组名就是它的首地址。

#include 
#include
int main(){ double score[] = {
98,87,65,43,76}; printf("数组的首地址:%p\t 数组手元素的地址 :%p\n",score,&score[0]);}

数组名就是数组元素的首地址。

422101-20171210000617685-1549460925.png

#include 
#include
int main(){ int i; double score[5] = {
98,87,65,43,76}; double * ptr_score; ptr_score = score; for (i=0;i<5;i++) { printf("%.2lf\n",*ptr_score++); // 通过首地址取找数组元素的值 } for (i=0;i<5;i++) { printf("%.2lf\n",score[i]); }}

等价的!double类型的数据,每个数据移动了8个字节。物理地址是一个十六进制的数字。

#include 
#include
int main(){ int array[] = {
15,20,25,30,35}; int i; int * ptr_array = array; for (i = 0;i<5;i++) { printf("第%d个元素的值为%d,地址为%p\n",i,*ptr_array,ptr_array); ptr_array ++ ; } /* 第0个元素的值为15,地址为0028FF0C 第1个元素的值为20,地址为0028FF10 第2个元素的值为25,地址为0028FF14 第3个元素的值为30,地址为0028FF18 第4个元素的值为35,地址为0028FF1C */ return 0;}

int型地址间隔4个字节。

#include 
#include
#include
#define N 7int main(){ int array[N] = {
15,20,25,30,35,40,90}; int i; int temp; // 实现数组的逆序 // 数组的首尾元素进行交换 for (i = 0;i

逆序数组,找规律是写程序必备的技能!

#include 
#include
#include
#define N 7int main(){ int array[N] = {
15,20,25,30,35,40,90}; int i; int temp; int * ptr_head; int * ptr_foot; ptr_head = &array[0]; ptr_foot = &array[N-1]; // 实现数组的逆序 // 数组的首尾元素进行交换 for (i = 0;i

指针实现数组逆序!

二维数组与指针

首地址

&a[0][0]

有祥有略!有精有简!有的放矢有的取舍去学习!

何为二维数组,如何理解?由n个一维数组组成!

#include 
#include
#include
int main(){ int i,j; double score[5][3] = { {
55,56,57}, {
58,59,60}, {
61,62,63}, {
64,65,66}, {
67,68,69} }; // 传统的访问方式 for (i = 0;i < 5;i++) { for (j = 0;j <3 ;j++) { printf("%.2lf\t",score[i][j]); } printf("\n"); } printf("=================================\n"); // 指针的方式访问 for (i = 0;i < 5;i++) { for (j = 0;j <3 ;j++) { // printf("%.2lf\t",*(score[i] + j)); printf("%.2lf\t",*(*(score+i) + j)); } printf("\n"); } return 0;}

*(*(score + i) + j) 获取二维数组的公式!

本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/8025510.html,如需转载请自行联系原作者

你可能感兴趣的文章
按日期、时间批量删除文件
查看>>
Ubuntu16.04部署phantomjs的一个问题
查看>>
总结js(1)
查看>>
CTF---Web入门第四题 Forms
查看>>
PowerDesigner的安装
查看>>
webservices 服务器未能识别 HTTP 头 SOAPAction 的值:.
查看>>
iOS应用开发,全局强制竖屏,部分页面允许旋转的处理
查看>>
Linux运维教程
查看>>
Git学习
查看>>
问到的问题
查看>>
iOS网络模块优化(失败重发、缓存请求有网发送)
查看>>
经典SQL语句大全(绝对的经典)
查看>>
中小研发团队架构实践之总体架构设计
查看>>
PDO中获取结果集
查看>>
实用主义性能测试
查看>>
oozie开发注意事项
查看>>
【Tomcat】linux下实时查看tomcat运行日志
查看>>
HDU 5212 Code
查看>>
yarn使用
查看>>
Hadoop之 MapReducer工作过程
查看>>