首先我们要知道指针是什么?
指针理解的两个要点:
1.指针是内存中一个最小单元的编号,也就是地址
2.平时我们所说的指针,通常指的是指针变量,是用来存放地址的变量
总结:指针就是地址,口说的指针通常指指针变量
下面我们通过一串代码理解一下:
#include <stdio.h>
int main()
{
int a = 10;
char ch;
//pa用来存放a的地址,pa也是一个变量,他也有一个地址
//*只能表明pa是一个指针
int * pa = &a;
*pa = 20;//解引用操作符(间接访问操作符)
printf("%d\n", a);
char * pc = &ch;
printf("%d\n", sizeof(pa));
printf("%d\n", sizeof(pc));
printf("%p\n", &a);
return 0;
}
通过调试可以发现,监视下的&a0x012FF840和内存中a的地址相等,ch同理
运行该串代码,得到以下结果:
1.通过*pa找到a,并将其值改为20;
2.运行发现,指针类型无论是int还是char,他的大小都是四个字节。这是因为指针大小在32位平台是四个字节,在64位平台是八个字节。此处运行结果是在32位平台运行
3.地址00EFFC7C是a的新地址,通过解引用操作,a的值被修改,地址也发生了变化
通过上述内容也可以发现,指针的大小一致,为何不用一个统一的字符来表示指针的类型呢?
下面我们来看一下,不同的指针类型,有何区别
#include<stdio.h>
int main() {
int a = 0x11221122;
/*int* pa = &a;
*pa = 0;*/
char* pc = &a;
*pc = 0;
return 0;
}
对pa进行操作:内存中a的四个字节全被改变
对pc进行操作:内存中a只有一个字节发生变化
总结:
1.指针类型决定了:指针进行解引用操作的时候,访问几个字节(权限)。
char*的指针解引用访问1个字节
int*的指针解引用访问4个字节
double*的指针,解引用访问8个字节
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);
return 0;
}
总结:
2.指针类型决定了指针的步长(向前/向后走一步都多大距离)int*指针+1(-1),意思是跳过一个整型,也就是向后(前)走4个字节
char*指针+1(-1),意思是跳过一个字符,也就是向后(前)走1个字节
double*的指针+1,意思是跳过一个double, 也就是向后走8个字节short* +1, 向后走2个字节
下面来简单测试一下,利用指针解引用对数组进行赋值:
int main()
{
int arr[10] = { 0 };
int* p = arr;//数组名就是数组首元素的地址arr->&arr[0];
int i = 0;
for (i = 0; i < 10; i++)//从数组下标为0依次赋值
{
*(p + i) = i + 1;
printf("%d ", arr[i]);
}
//1~10
//int i = 0;
//for (i = 0; i < 10; i++)
//{
// *p = i + 1;
// p++;
//}
return 0;
}
本文章仅供参考,如有问题欢迎大家指正哦!!!