> 文档中心 > 指针一、指针入门和一些骚操作

指针一、指针入门和一些骚操作

一、什么是指针,指针与变量的区别

        指针的定义:如果一个首地址,我们要找到它,我们就称它为指针。一种访问内存的方式。

        变量的定义:绑定一块内存段,是可读可写的,而常量是只读不写。

        地址:区分内存里每一个字节---每个字节的编号是正整数。

        首地址:一块内存段存取一个数据。

        指针变量:内存段里装指针。

         如何读取指针指向内存的值:用解引用(*指针名)。若是直接  解引用(*)+指针名,读取访问的是整个内存段的值。

                注意:一般在我们的编程语言中,地址默认为就是首地址。

二、指针的计算和偏移

                指针 – 整数  =  指针

                指针 + 整数  =  指针

                指针 – 指针  =  单位长度

例如:分别对指针   +1

#includeint main() {int a = 11, b = 22, c = 33;printf("a=%d  b=%d  c=%d\n", a, b, c);printf("a的地址:%d ,b的地址:%d ,c的地址:%d \n", &a, &b, &c);//使用10进制打印输出每个数的地址int* pa, * pb, * pc;pa = &a;pb = &b;pc = &c;printf("a的地址:%d ,b的地址:%d ,c的地址:%d \n", pa + 1, pb + 1, pc + 1);//分别对这三个指针+1while (1){}return 0;}

结果:

 

 解析:pa+1   :这里不是加上1,而是加上1乘以  pa该数据类型在内存中的大小(字节数)  =>这里相当于加上了 1*4=4

问题1:若是 char *p1=&a;     printf("a=%d",p1+3);   那a的地址将输出为多少呢?

问题2:若是 double *p1=&c;     printf("c=%d",p1+3);   那a的地址将输出为多少呢?

问题3:在上面的代码中   *pa-*pb等于多少呢

以上三个问题的答案:

 ------>结果1:这里输出的结果将是  5241516+ 1*3=

 ------>结果2:这里输出的结果将是  5241492+ 8*3=

------->结果3:这里输出的结果将是  (5241516-5241504)/4=3

注意: int a,b,c;                                ----->这定义的是三个整型变量  

            int* a, b,c;                              ----->第一个int型指针变量,后两个定义的是两个int型变量

            int* a, *b, *c;                          ------>这才是定义了三个int型指针变量

三、二级、三级指针

       变量的定义:从书上你会看到它的定于是这样的(字面意思):会发生改变的量

                正确的话应该是这样定义的:绑定一块内存段就称为变量。

         一级指针的定义:指向一块内存段

        二级指针的定义:指向一级指针的指针

        三级指针的定义:指向二级指针的指针

        一级指针变量的定义:  数据类型 * 指针名;    如  int *pa;

        二级指针变量的定义:  数据类型 ** 指针名;    如  int **ppa;

        三级指针变量的定义:  数据类型 *** 指针名;    如  int ***pppa;

        若      int  m=666;    int *pa=&m;    --------- 输出*pa,结果是666    *pa    m变量

                  int  **ppa=&pa;                  ---------输出*ppa ,结果是pa的地址(这里是m的地址)

                                                                           输出**ppa ,结果才是666(m变量的值)        

                                                                解析理解:**ppa = *(*ppa)= *pa= 666

四、指针在内存段的存储形式以及如何访问输出

1.从键盘上输入一个整数,将其转化为16进制输出

2.依次访问输出    这个十六进制    在内存中每一个字节上的值

图片分析: 

代码详解:

I、unsigned int* n = &m;     ------定义一个无符号的int型指针

II、*((unsigned char*)n + 1);   --------1、先看(unsigned char*)n,这是将int型指针强转为无符号char型指针,相当于将n的内存段(四个字节)分成了4部分,每一部分一个字节,此时指针指向第一个char(一个字节)

                                                  --------2、再看(unsigned char*)n + 1相当于在原来1的基础上移动了一个字节,此时指针指向的是内存的第二个字节

#include//任何数据类型都是默认为有符号的int main() {unsigned int m;printf("请输入一个数:");scanf_s("%d", &m);printf("这个数的16进制为:0X%x\n", m);unsigned int* n = &m;printf("其十六进制在内存中的位置依次是:%x  %x  %x  %x\n", *(unsigned char*)n, *((unsigned char*)n + 1), *((unsigned char*)n + 2), *((unsigned char*)n + 3));printf("%2X  %2d\n", *(unsigned char*)n, *(unsigned char*)n);printf("%2X  %2d\n", *((unsigned char*)n + 1), *((unsigned char*)n + 1));printf("%2X  %2d\n", *((unsigned char*)n + 2), *((unsigned char*)n + 2));printf("%2X  %2d\n", *((unsigned char*)n + 3), *((unsigned char*)n + 3));while (1){}return 0;}

结果: 

总结:指针在C语言中可谓是最重要的一部分了,学会了,你可以玩出各种花样,可在他人面前秀一波。当然,这还仅仅是指针的基础部分,关注博主,带你了解高级指针(函数指针、数组指针、指针数组、常量指针、指针常量等);