#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
//---------------------------------------------------BIT - 6 - 指针-------------------------------------------------
1.指针是什么
2.指针和指针类型
3.野指针
4.指针运算
5.指针和数组
6.二级指针
7. 指针数组
//-------------------------------------------------------------------------------------------------1 指针是什么
1.指针是内存中一个最小单元的编号,也就是地址
2.平时口语中说的指针, 通常指的是指针变量, 是用来存放内存地址的变量
总结 : 指针就是地址, 。//指针变量:
我们可以通过& (取地址操作符)取出变量的内存 起始地址, 把地址可以存放到一个变量中, 这个变量就是指针变量
int main()
{int a = 10; // a 是整型变量,占用4个字节的内存空间int* pa = &a; // pa 是一个指针变量,用来存放地址的,pa 的类型是 int*//本质上,指针就是地址//口语中说的指针通常指的是指针变量,指针变量是用来存放地址的一个变量return 0;
}
一个内存单元是 1 字节,1字节byte = 8比特位bit
在32位的机器上, 地址是32个0或者1组成二进制序列, 那地址就得用4个字节的空间来存储, 所以一个指针变量的大小就应该是4个字节。
那如果在64位机器上, 如果有64个地址线, 那一个指针变量的大小是8个字节, 才能存放一个地址。
指针变量是用来存放地址的, 地址是唯一标示一块地址空间的。
指针的大小在(X86)32位平台是4个字节, 在(X64)64位平台是8个字节。
//----------------------------------------------------------------------------------------- 2 指针和指针类型
int main()
{char* pc = NULL;short* ps= NULL;int* pi= NULL;double* pd= NULL;//sizeof() 返回的值的类型是无符号整型 unsigned intprintf("%zu\n", sizeof(pc)); //8printf("%zu\n", sizeof(ps)); //8printf("%zu\n", sizeof(pi)); //8printf("%zu\n", sizeof(pd));//8return 0;
}
//----------------------------------------------------------------------------指针类型的意义 2.1
int main()
{int a = 0X11223344;int* pa = &a;*pa = 0;//---------------------------结论1----------------------------//指针类型决定了指针在被解引用的时候访问几个字节//如果是 int* 的指针,解引用访问四个字节//如果是 char* 的指针,解引用访问一个字节//推广到其他类型//如果是 double* 的指针,解引用访问八个字节return 0;
}
//100 10进制
//0x64 16进制
//110 0100 2进制
//144 8进制
//----------------------------------------------------------------------------指针类型的意义 2.2
int main()
{int a = 0X11223344;int* pa = &a;char* pc = &a;printf("pa=%p\n", pa);printf("pc=%p\n", pc);printf("pa+1=%p\n", pa + 1);printf("pc+1=%p\n", pc + 1);//pa = 000000F88CAFF994//pa + 1 = 000000F88CAFF998//pc = 000000F88CAFF994//pc + 1 = 000000F88CAFF995//pa pc 两个结果一样,因为都存放的都是 a的地址//pa+1(加了4个字节) pc+1 (加了1个字节)结果不一样//---------------------------结论2----------------------------//指针的类型决定了指针+-1时,跳过几个字节//决定了指针的步长//想让指针一次访问几个字节,用对应的指针类型return 0;
}
int main()
{int a = 0;int* pi = &a; // pi 解引用访问4个字节,pi+1也跳过4个字节float* pf = &a; // pf 解引用访问4个字节,pf+1也跳过4个字节// int* 和 float* 可以通用?//不能*pi = 100;*pf = 100.0;//1120403456//100.000000printf("%d\n%f\n", *pi, *pf);//二者结果不同, int* 和 float* 对内存的解读方式有差异,不能混用 return 0;
}
//--------------------------------------------------------------------------------------------------------- 3 野指针