指针一、指针入门和一些骚操作
指针的定义:如果一个首地址,我们要找到它,我们就称它为指针。一种访问内存的方式。
变量的定义:绑定一块内存段,是可读可写的,而常量是只读不写。
地址:区分内存里每一个字节---每个字节的编号是正整数。
首地址:一块内存段存取一个数据。
指针变量:内存段里装指针。
如何读取指针指向内存的值:用解引用(*指针名)。若是直接 解引用(*)+指针名,读取访问的是整个内存段的值。
注意:一般在我们的编程语言中,地址默认为就是首地址。
二、指针的计算和偏移
指针 – 整数 = 指针
指针 + 整数 = 指针
指针 – 指针 = 单位长度
例如:分别对指针 +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语言中可谓是最重要的一部分了,学会了,你可以玩出各种花样,可在他人面前秀一波。当然,这还仅仅是指针的基础部分,关注博主,带你了解高级指针(函数指针、数组指针、指针数组、常量指针、指针常量等);