何为指针?
可以通过指针找到以其为地址的内存单元。指针就是变量,只不过存放在指针的值被当做地址处理
指针和指针类型
根据下图我们可知不同指针类型的存储大小是一样的,并根据计算机位数决定的,64位一般是8个字节
int main()
{
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(double*));
return 0;
}
指针类型的意义
1.决定访问内存大小
int a = 0x11223344;
int* pa = &a;
*pa = 0;
根据下图可知当&a以int* 类型解引用的时候该指针所指的值改变了4个字节
int a = 0x11223344;
char* pc = &a;
*pc = 0;
根据下图可知当&a以char*类型解引用的时候该指针所指的值改变了一个字节
故我们得到指针类型的作用在于在解引用的时候访问内存的大小
2.决定偏移量
根据下图,我们得到,当int*指针时,指针加1向后偏移4个字节;当char*时,指针加1向后偏移1个字节,因此指针类型还觉得指针+1所偏移的量
int a = 0x11223344;
int* pa = &a;
char* pc = &a;
printf("%p\n", pa);
printf("%p\n", pa + 1);
printf("%p\n", pc);
printf("%p\n", pc + 1);
野指针
1.指针未初始化
int* p;
*p = 20;
printf("%d\n", *p);
2.指针越界访问
当循环访问超过数组范围,使指针指向值不明确
int main()
{
int arr[10] = { 0 };
int* p = arr;
int i = 0;
for (i = 0; i < 12; i++)
{
p++;
}
}
3.指针指向了空间释放
int* test()
{
int a = 10;
return &a;
}
int main()
{
int* p = test();
*p = 20;
}
指针的运算
1.指针+-整数
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int* p = arr;
for (i = 0; i < sz; i+=2) //每隔2打印数组的值
{
printf("%d ", *p);
p += 2;
}
int arr[5] = { 0 };
int* vp = arr;
for (vp = &arr[0]; vp < &arr[5];) 对arr数组每个元素赋值1
{
printf("%d ", *vp++ = 1);
}
2.指针+-指针
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//算的是两个地址之间的元素个数
printf("%d ", &arr[9] - &arr[0]);
//输出为9
int my_strlen(char arr[]) //利用指针相减计算字符串长度
{
char* str = &arr[0];
char*end = &arr[0];
while(*end != '\0')
{
end++;
}
return end - star;
}