指针初级详解
1. 指针是什么 指针是个变量,存放内存单元的地址
2. 指针和指针类型
3. 野指针
4.指针运算
5. 指针和数组
6. 二级指针
7. 指针数组
int main()
{
int a = 10;//在内存中开辟一块空间
int* p = &a;
//在这里我们对变量a,取出它的地址,可以使用&操作符。
//将a的地址存放在p变量中,p就是一个指针变量
//总结:指针就是变量,用来存放地址的变量,(存放在指针中的值,都被当成地址处理)
总结:指针是用来存放地址的,地址是唯一标示一块地址空间的
总结:指针的大小在32位平台是4个字节,在64位平台上是8个字节
return 0;
}
- 总结:指针是用来存放地址的,地址是唯一标示一块地址空间的
- 总结:指针的大小在32位平台是4个字节,在64位平台上是8个字节
指针类型的第一个意义 解引用操作
int main()
{
/*printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(double*));*/
int a = 0x11223344;//16进制两个数是1个字节
int* pa = &a;
char* pc = &a;
printf("%p\n", pa);//006FF920
printf("%p\n", pc);//006FF920
/*
&a无论放到 int* 还是char*中都可以存放a的地址
但是它们有什么区别呢
*/
*pa = 0;//是int
*pc = 0;//是char
/*
但是对它们进行解引用操作的时候 *pa可以改4个字节内容
就可以改成00 00 00 00
但是*pc是只可以改一个字节内容,因为是char型的
就会改成 00 33 22 11 只会改一个字节的内容
所以指针类型决定了指针进行解引用操作的时候能够访问空间的大小
int* p ; *p能够访问4个字节
char* p ; *p能够访问1个字节
double* p ; *p能够访问8个字节
*/
return 0;
}
总结: 指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节),比如
char* 的指针解引用就只能访问一个字节,而int*的指针的解引用就能访问4个字节
指针类型的第二个意义 指针+整数
int main()
{
int a = 0x11223344;
int* pa = &a;
char* pb = &a;
printf("%p\n", pa); //00EFFA28
printf("%p\n", pa + 1);//00EFFA2C 这里加了1因为pa是整型所以加了4个字节8+4=c c是12
printf("%p\n", pb); //00EFFA28
printf("%p\n", pb + 1);//00EFFA29这里加1是因为pb是char型所以加了1个字节8+1=9
指针类型决定了:指针走一步走多远(指针的步长)
int* p; p+1 -->4个字节 +1意思是加了一个整型
char* p p+1 -->1个字节 +1意思是加了一个字符型
double* p p+1 -->8个字节 +1意思是加了一个双精度型
return 0;
总结;指针的类型决定了指针向前或者向后走一步有多大(距离)
}
总结;指针的类型决定了指针向前或者向后走一步有多大(距离)
野指针
野指针:野指针就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)
野指针成因 :
1. .指针未初始化
2. 指针越界访问
3. 指针指向的空间释放
1.指针未初始化
int main()
{
// int a;//局部变量不初始化,默认是随机值
int *p;//局部的指针变量,不初始化,随机值
return 0;
}
2.指针越界访问
int main()
{
int arr[10] = {
0 };
int* p = arr;//数组名首元素的地址
int i = 0;
for (i = 0; i <