ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

深入暴风学习C指针(一)

深入暴风学习C指针(一) 文章目录1.内存和地址内存编址的概念内存编址的实质2指针变量和地址取地址操作符指针变量和解引⽤操作符*指针变量的⼤⼩3指针变量类型的意义指针的解引⽤指针-整数void* 指针4指针运算指针- 整数指针 - 指针指针的关系运算1.内存和地址从硬件层面上讲内存是计算机中进行存储的硬件部位它常常需要与CPU协同工作。CPU可以从内存读取数据也可以存储数据到内存中并且我们知道电脑上内存通常是8BG/16GB/32GB等。内存编址的概念我们进入酒店某个房间时是根据房卡上的门牌号快速找到对应的房间的那么类似于生活中的实例内存单元也是有内存编号的这样CPU才能快速地在内存中的特定位置进行读写信息。在计算机中内存单元的编号称为地址而在C语言中地址称为指针。所以内存单元编号地址指针。内存编址的实质计算机中有很多硬件单元硬件单元与硬件单元是相互独立又需要协同工作的首先需要满足的是数据的传递它们之间的工作是用线连起来的。在CPU和内存之间有三组线分别是控制总线、数据总线和地址总线。假如当CPU需要向内存中读取数据时首先CPU将目标单元地址发送到地址总线随后经由控制总线发出读控制信号内存根据地址选中对应单元把数据送到数据总线最后传送给CPU。关于地址总线可以简单理解32位机器上有32根地址总线每根线有2态表示0和1那么一根线就能表示2种含义2根线就能表示4种含义32根线能表示⽰2^32种含义每种含义代表一个地址。一个地址是32个0/1的二进制需要32个bit位存储也就是4个字节。2指针变量和地址取地址操作符intmain(){inta10;int*pa;//编号 地址 指针//p被称为指针变量理解为存放指针的变量//指针变量也是变量指针变量是专门用来存放地址的return0;}在以上代码种用操作符取出了a的地址存放在了指针变量p中。指针变量和解引⽤操作符*intmain(){inta10;int*pa;*p0;//解引用操作符printf(%d\n,a);//0return0;}在以上代码中通过解引用操作符*改变了p所指向对象的内容所以a中的值变成了0。指针变量的⼤⼩intmain(){char*pc;printf(%zu\n,sizeof(pc));//8printf(%zu\n,sizeof(char*));//8printf(%zu\n,sizeof(int*));//8printf(%zu\n,sizeof(short*));//8printf(%zu\n,sizeof(long*));//8printf(%zu\n,sizeof(longlong*));//8printf(%zu\n,sizeof(float*));//8printf(%zu\n,sizeof(double*));//8return0;}64位的机器上地址是通过64位地址线传递的那么一个地址就是64个0/1的二进制需要64个bit位存储 8个字节指针变量的大小也就是8个字节。3指针变量类型的意义指针的解引⽤intmain(){inta0x11223344;int*paa;*pa0;return0;}intmain(){inta0x11223344;char*paa;*pa0;//只改变了a中低字节位置上的44return0;}intmain(){inta0x11223344;double*paa;*pa0;//越界return0;}指针±整数intmain(){inta10;int*paa;char*pca;printf(pa %p\n,pa);//pa中存放的是a的地址printf(pa1 %p\n,pa1);//pa1一次跳过四个字节printf(pc %p\n,pc);//pc中存放的也是a的地址printf(pc1 %p\n,pc1);//pc1一次跳过一个字节return0;}void* 指针void指针是⽆具体类型的指针或者叫泛型指针这种类型的指针可以⽤来接受任意类型地址。intmain(){inta10;charchw;void*pva;pvch;//void* 类型的指针不能直接进⾏指针的 -整数和解引⽤的运算//*pv e; err//pv pv 1; errreturn0;}4指针运算指针± 整数//利用指针打印数组元素intmain(){intarr[10]{1,2,3,4,5,6,7,8,9,10};inti0;intszsizeof(arr)/sizeof(arr[0]);int*parr[0];for(i0;isz;i){printf(%d ,*(pi));}return0;}指针 - 指针//指针-指针//得到的是两个指针之间的元素个数//前提是两个指针指向了同一块空间否则不能相减intmain(){intarr[10]{0};printf(%d\n,arr[0]-arr[9]);//9printf(%d\n,arr[9]-arr[0]);//-9return0;}指针的关系运算//利用指针打印数组元素--方法三利用指针的关系运算的知识intmain(){intarr[10]{1,2,3,4,5,6,7,8,9,10};intszsizeof(arr)/sizeof(arr[0]);int*parr;while(parrsz){printf(%d ,*p);p;}return0;}
返回列表