一、指针定义
指针是一个变量,存放内存单元的地址(编号)
二、指针类型的意义
首先,用一段代码计算一下不同类型指针的长度分别是多少
#include<stdio.h>
int main()
{
printf("%d\n",sizeof(int*));
printf("%d\n",sizeof(char*));
printf("%d\n",sizeof(double*));
printf("%d\n",sizeof(float*));
}
令人匪夷所思的是:最后结果是一样的都是8(在64位的pc机上)
这会让人怀疑:类型不同,为什么指针的长度都是一样的?
这时我们可以把地址打印一下:
#include<stdio.h>
int main()
{
int i=0x11223344;
int* pa=&i;
//char* pc=&i;
printf("%p\n",pa);
//printf("%p\n",pc);
}
这时我们又发现char类型和int类型所存储的地址一模一样,这时我们更疑惑,指针类型不同好像没有什么意义,但是经过思考又发现:
#include<stdio.h>
int main()
{
int i=0x11223344;
int* pa=&i;
//char* pc=&i;
printf("%p\n",pa+1);
//printf("%p\n",pc+1);
}
最终的输出结果是不一样的,同样是在指针pa和pc后加1,char类型的指针最终输出的地址比原地址多1,而int类型的指针最终输出的地址比原地址多4。
到这可以思考一下:1和4,char类型占1个字节,而int类型占4个字节。所以指针类型的不同代表了步长的不同(通俗点说就是指针走一步能走多远)
举个例子(指针访问数组):(将数组中的元素全部赋值为1)
#include<stdio.h>
int main()
{
int arr[10]={0};
int* pa=arr;
int i=0;
for(i=0;i<10;i++)
{
*(p+i)=1;
printf("%d\n",*(p+i));
}
}
同理:当我们运用*(解引用操作符)时,可以计算不同类型指针走一步其能够访问空间的大小
int* pa:*pa能访问4个字节
char* pa:*pa能访问1个字节
double* pa:*pa能访问8个字节
三、野指针
1.概念:就是指针指向的位置是不可知的(随机的、不确定的、没有明确限制的)
2.形成原因:
- 局部变量未初始化:
#include<stdio.h>
int main()
{
int a;//局部变量不初始化,默认是随机值
int* p;//局部的指针变量,就被初始化随机化
*p = 20;
}
最后导致:程序无法正常运行
- 指针越界访问:
#include<stdio.h>
int main()
{
int arr[10]={0};
int* pa=&a;
int i=0;
for(i=0;i<=11;i++)
{
*(pa+1)=i;//超出了数组元素的长度,称为野指针
}
}
- 指针指向的空间释放:(运用到函数)
前言:参数分为形参和实参,形参一旦运行完毕就会自动销毁
#include<stdio.h>
int* test()
{
int a = 10;//a是局部变量
return &a;
}
int main()
{
int* p=test();
printf("%d\n", *p);
return 0;
}
持续更新关于指针的内容,感兴趣可以追更。