广西建网站哪家好,网站制作风格类型,丹阳网站制作,自学做网站要多久指针是C语言的灵魂#xff0c;有了指针C语言才能完成一些复杂的程序#xff1b;没了指针就相当于C语言最精髓的部分被去掉了#xff0c;可见指针是多么重要。废话不多讲我们直接开始。 指针 一#xff0c;内存和地址二#xff0c;编址三#xff0c;指针变量和地址1#…指针是C语言的灵魂有了指针C语言才能完成一些复杂的程序没了指针就相当于C语言最精髓的部分被去掉了可见指针是多么重要。废话不多讲我们直接开始。 指针 一内存和地址二编址三指针变量和地址1取地址操作符2指针变量3解引用操作符4指针变量的大小 四指针类型的意义五偏移量六指针的运算 一内存和地址
谈到指针我们首先就会想到地址因为指针就是地址。为什么这么会认为指针它就是地址呢指针与地址有什么关联呢想要回答上面两个问题那我们就先来探究一下内存和地址的关系。 我们举一个生活中的例子你就知道了我们生活中所看见的学校的宿舍楼其实就是内存比如一栋一栋的宿舍喽在建造之初就规定好了有多少个房间房间里能住几个人。这可以说是宿舍楼的内存而计算机也一样计算机就是将一个大内存分成若干个小的内存单元每个内存单元占一个字节这里就相当于一栋宿舍楼有若干间数而每一字节占8个比特位就相当于一间能住8个人。 这里给出一些常见的内存单位 了解完内存我们来说说地址地址就相当于门牌号平时在购物时买东西填的地址填的可不就是家里的门牌号嘛所以通过门牌号地址快递员才能找对地方给我们派件对应计算机也是一样的地址为每一个内存进行编号。比如上面所说的宿舍楼每一间都有不同的门牌号,只不过C语言给地址取了一个新的名字叫指针我们给出一张图来让你更直观和清晰的了解内存和地址的关系。 了解完了内存和地址接下来我们来了解一下编址。
二编址
谈到编址就不得不谈到一些硬件上的知识了要了解编址首先必须理解计算机内是有很多的硬件单元而硬件单元是要互相协同工作的。所谓的协同至少相互之间要能够进行数据传递。但是硬件与硬件之间是互相独立的那么如何通信呢
答案很简单用线连起来。 而CPU和内存之间也是有大量的数据交互的所以两者必须也用线连起来。 不过我们今天关心一组线叫做地址总线。 我们画图来让大家更好的理解
搞清楚上图的原理我们来说说为什么要编址 CPU访问内存中的某个字节空间必须知道这个 字节空间在内存的什么位置而因为内存中字节很多所以需要给内存进⾏编址(就如同宿舍很多需要给宿舍编号⼀样)。但是计算机中的编址并不是把每个字节的地址记录下来而是通过硬件设计完成的。 上面说到什么地址总线数据总线控制总线那大家是不是很好奇为什么电路板上会有这么多的线呢 在硬件电路中只有高电平和低电平这两种状态这两种状态分别代表0和1但是你想想既然一根能表示两种状态那么2根能表示3种以此类推以2的n次方呈现指数式增长而线越多能表示的东西也越多比如我们现在用的64位机器就可以表示2^64这么多种含义而每一种含义都代表一个地址地址信息被下达给内存在内存上就可以找到 该地址对应的数据将数据在通过数据总线传入CPU内寄存器。 三指针变量和地址
1取地址操作符
既然指针与地址关系那么密切那我们就有必要来学习一下取地址操作符我们给出一段代码
#includestdio.h
int main()
{int a 10;printf(%p,a);//%p是专门用来打印地址的占位符 注意是a
}我们也可以调试起来让大家来看 但有一点需要特别注意取地址取出来的是较小的地址因为我们知道数据类型占几个字节又知道较小的地址剩下的顺藤摸瓜直接往后推算即可。
我们来看看在内存中是怎么样存储的
2指针变量
我们已经了解了操作符并且已经拿到了变量的地址那么这时就会有人问了我们已经拿到了变量的地址怎么去存放它呢答案是使用指针变量。
#includestdio.h
int main()
{int a 10;char b b;char * ch b;int * p a;
}上面我们定义了两个指针变量分别为ch和p来储存a和b的地址这样我们就可以通过访问指针变量来间接访问a和b。我们如何来看待指针变量呢
这里p左边写的是 int * 是在说明p是指针变量而前面的 int 是在说明pa指向的是整型(int) 类型的对象。 ch左边写的是 char * 是在说明ch是指针变量而前面的 char 是在说明pa指向的是整型(int) 类型的对象。
画一个图你就明白了 当我们了解了如何存储地址后肯定会想这如何去使用它这就引出了我们的解引用操作符。
3解引用操作符
在现实生活中我们使用地址要找到⼀个房间在房间里可以拿去或者存放物品。 C语言中其实也是⼀样的我们只要拿到了地址指针就可以通过地址指针找到地址指针 指向的对象这里必须学习⼀个操作符叫解引用操作符(*)。 举个例子
#includestdio.h
itn main()
{int a 100;printf(a%d\n,a);int * p a;*p0;//*p拿到了p所指向的对象 a 对*p操作即是对a操作 这里就是间接访问printf(a%d,*p);//这里注意打印的一定是*p而不是preturn 0;
}从运行结果来看我们看到通过 * 这个解引用操作可以间接来改变a的值。 * p实际上就是通过通过pa中存放的地址找到指向的空间所以 * p本质上就是a变量了。
另外值得注意的是一定要分清 * p和p 前者是对p这个指针变量进行解引用操作后者则是指针变量其存储的是p所指向对象a的地址。 说完了解引用我们来看看指针变量的大小。
4指针变量的大小
32位机器假设有32根地址总线每根地址线出来的电信号转换成数字信号后是1或者0那我们把32根地址线产⽣的2进制序列当做⼀个地址那么⼀个地址就是32个bit位需要4 个字节才能存储。 如果指针变量是⽤来存放地址的那么指针变量的大小就得是4个字节的空间才可以。 同理64位机器假设有64根地址线⼀个地址就是64个⼆进制位组成的⼆进制序列存储起来就需要 8个字节的空间指针变量的大小就是8个字节。
#include stdio.h
//指针变量的⼤⼩取决于地址的⼤⼩
//32位平台下地址是32个bit位即4个字节
//64位平台下地址是64个bit位即8个字节
int main()
{ //zd是专门用来打印sizeof的返回值的printf(%zd\n, sizeof(char *)); printf(%zd\n, sizeof(short *)); printf(%zd\n, sizeof(int *)); printf(%zd\n, sizeof(double *)); return 0;
}我们分别让它在32位和64位平台下运行看看会有什么结果 我么可以看到在不同平台下的结果是不同的所以我们可以知道 • 32位平台下地址是32个bit位指针变量大小是4个字节 • 64位平台下地址是64个bit位指针变量大小是8个字节 • 注意指针变量的大小和类型是无关的只要指针类型的变量在相同的平台下大小都是相同的。 既然指针变量的大小和类型无关只要是指针变量在同⼀个平台下大小都是⼀样的为什么还要有各种各样的指针类型呢接下来我们就来探究一下指针类型的意义。
四指针类型的意义
我们先来看两段代码
#include stdio.h
int main()
{ int n 0x11223344; int *pi n; *pi 0; return 0;
}我们来看调试结果
#include stdio.h
int main()
{int n 0x11223344; char *pc (char *)n; //强制转换为char*的地址 赋给字符指针变量pc*pc 0; return 0;
}我们直接看调试结果 对比这两次调试结果不知各位读者有没有发现第一次*pi变成0结果整个n的值4个字节都变为了0。
而第二次*pc变成零只有前面一个字节变成了0。
由此我们得出结论指针的类型决定了对指针解引⽤的时候有多⼤的权限⼀次能操作指针所指对象的几个字节。 比如 char* 的指针解引⽤就只能访问⼀个字节而int* 的指针的解引⽤就能访问四个字节。 操作的一定是指针所指对象的空间
五偏移量
偏移量相信大家在物理中都能经常听到而偏移量在指针中代码什么意思呢偏移量指的就是指针变量加减整数时的那个数字叫做偏移量。偏移量是为了形象说明不是专有名词哈。 举个例子
#includestdio.h
int main()
{int a0;char*pc(char*)a;int *pia;printf(a %p\n,a);printf(pc %p\n,pc);printf(pc1 %p\n,pc1);printf(pi %p\n,pi);printf(pi1 %p\n,pi1);return 0;
}从上图我们可以看到: 我们可以看出 char 类型的指针变量1跳过1个字节 int 类型的指针变量1跳过了4个字节。 这就是指针变量的类型差异带来的变化。指针1其实跳过1个指针指向的元素。指针可以1那也可 以-1。偏移的其实就是一个类型的大小比如int类型 1就偏移4个字节。
结论指针的类型决定了指针向前或者向后偏移的距离。
了解完了这些基本的知识后我们就来看一些有关指针的的运算
六指针的运算
指针的基本运算有三种分别是 1,指针± 整数 2,指针-指针 3,指针的关系运算 我们依次给出代码大家可以体会一下
1指针加整数型
#includestdio.h
int main()
{//指针加整数型int arr[] { 1,2,3,4,5,6,7,8,9,10 };int sz sizeof(arr) / sizeof(arr[0]);int* p arr;for (int i 0;i sz;i){//printf(%d \n, p);//注意这样打印出来的是以%d形式打印的地址//printf(%p \n, p);//这样是打印所有元素的地址printf(%d , *p);//加上*号是解引用 这样打印的才是所有元素p;}return 0;
}#includestdio.h
int main()
{ int arr[] { 1,2,3,4,5,6,7,8,9,10 };int sz sizeof(arr) / sizeof(arr[0]);int* p arr;for (int i 0;i sz;i){printf(%d , *(p i));//pi括号指针变量加整数是偏移量的意思即 往后取i个地址并把该地址的内容以%d形式打印出来}return 0;
}2指针减指针及指针的关系运算
#include stdio.h
int my_strlen(char *s)
{ char *p s; while(*p ! \0 ) p; return p-s;
}
int main()
{ printf(%d\n, my_strlen(abc)); return 0;
}以上就是本章的全部内容啦 感谢能够看到这里的读者如果我的文章能够帮到你那我甚是荣幸文章有任何问题都欢迎指出制作不易还望给一个免费的三连你们的支持就是我最大的动力