指针是什么? 指针就是一个内存地址,代表的就是一块内存空间。
part 1: 初探指针
// 定义一个 int类型的变量 i 值为5
int i = 5;
// &i 中的 &为取地址符,可以得到 i 的地址,%x 为十六进制输出
printf("i的地址 %#x\n",&i);
// 指针变量 定义一个int* 类型的变量p
int* p;
// 把 i 的地址给 p,现在 p 就存放的 i 的地址
p = &i;
printf("i=%d\n",i);
// *p --> 当指针变量前面有*的时候,表示取这个指针变量所存放的地址里面对应的数据
printf("*p的值%d\n",*p);
part 2: 指针占多少字节
int i =3;
double d = 3.141692;
float f = 3.1423;
char c ='B';
int* ip = &i;
double* dp = &d;
float* fp = &f;
char* cp = &c;
printf("int 类型指针变量的长度为 %d\n",sizeof(ip)); // --> 4
printf("double 类型指针变量的长度为 %d\n",sizeof(dp)); // --> 4
printf("float 类型指针变量的长度为 %d\n",sizeof(fp)); // --> 4
printf("char 类型指针变量的长度为 %d\n",sizeof(cp)); // --> 4
part 3: 指针与数组
// 数组是一块连续的内存空间 数组名 就是内存空间的首地址
// 数组名[i] == *(数组名+i);
// 定义一个数组
int arr[5] ={1,2,3,4,5};
printf("a[0]=%d\n",arr[0]); // --> 1
printf("a[4]=%d\n",arr[4]); // --> 5
printf("a[4]=%d\n",*(arr+4)); // --> 5
// 问题: arr[i] *(arr+i) 代表的是同一个变量么?
printf("arr[4]地址 = %#X\n",&arr[4]); // --> 0X28FF28
printf("arr[4]地址 = %#X\n",arr+4); // --> 0X28FF28
// 代表的是同一块内存空间 指向的是同一个变量
// arr是一个什么东西呢?
printf("arr = %#X\n",arr);
// 打印 数组的第一个元素的地址
printf("arr[0]地址 = %#X\n",&arr[0]);
// 发现每个内存地址是递增 4 的,为什么 因为 int类型 占用 4个字节
printf("arr[1]地址 = %#X\n",&arr[1]);
printf("arr[2]地址 = %#X\n",&arr[2]);
part 4: 指针的运算
// 指针的运算和数组都是紧密关联的
char* pChar = &arr[2];
printf("pChar的内存地址:%#X,对于的值为:%c\n", pChar, *(pChar));
printf("pChar + 1 的内存地址:%#X,对于的值为:%c\n", pChar + 1, *(pChar + 1));
// pChar的内存地址:0X28FF22,对于的值为:c
// pChar + 1 的内存地址:0X28FF23,对于的值为:d
// 指针的运算 按照 约定好的数据类型, 偏移相对应的内存空间的大小 !