指针---不同指针类型的区别
指针类型决定了指针进行解引用操作的时候,能够访问空间的大小
指针+1代表了不同的类型+1跳过的不同字节
eg:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 0x11223344;
/*int* pa = &a;//访问前四个
*pa = 0;*/
char* pc = &a;//访问第一个
*pc = 0;
return 0;
}
指针初始化区别
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[10] = { 0 };//定义一个整型数组10个元素全部初始化为0
int* p = arr;//数组内每个元素为整型4个字节
int i = 0;//一次定义一个元素,而使用char* arr的话十遍之后只能初始化前两个半元素,
//char* p = arr;
for (i = 0; i < 10; i++)//把十个内容都定义为1
{
*(p + i) = 1;
}
return 0;
}
野指针产生原因
1.指针未初始化--2.指针的越界访问--3.指针指向的空间释放
1.指针未初始化--
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a;//局部变量不初始化,默认为随机值
int *p;//局部指针变量,没有初始化就被定义为随机值(地址随机)
return 0;
}
2.指针的越界访问--
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[10] = {0};
int* p = arr;
int i = 0;
for (i = 0; i < 12; i++)
{
p++;//当p++到数组空间外就成为了野指针
}
return 0;
}
3.指针指向的空间释放
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int* test()
{
int a = 10;
return &a;//返回的是地址就得需要用指针类型接收
}
int main()
{
int *p=test();//定义指针类型
*p = 20;//此时出了函数范围,a的地址空间已经被销毁,*p已经无法找到a的正确地址
//此时*p已经成了野指针
return 0;
}
如何避免出现野指针
1.指针初始化
2.小心指针越界
3.指针指向空间释放既使之值NULL
4.指针使用之前检查有效性
1.
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
//eg:指针初始化
int a = 10;
int* pa = &a;//可以直接进行初始化
int* p = NULL;//实在不知道初始化可以先赋值给NULL
return 0;
}
2.
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 10;
int* pa = &a;
*pa = 20;
pa = NULL;//当使用完指针不想对其操作了,可以将其指向NULL,相当于断了之间的联系
return 0;
}
指针运算(+)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int* p = arr;
for (int i = 0; i < sz; i++)
{
printf("%d ",*p);
p=p+1;
}
return 0;
}
指针-指针=中间的元素个数(数组)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int* p1 = &arr[0];
int* p2 = &arr[9];
printf("%d\n",&arr[9] - &arr[0]); //9,他们之间的元素个数
printf("%d", *p2-*p1); //9,他们之间的元素个数
return 0;
}
指针的关系大小
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define vp_tt 5
int main()
{
float values[vp_tt];
float* vp;
for (vp = &values[vp_tt]; vp > &values[0];)
{
*--vp=0;//将数组前五个都设置为0
printf("%c ",vp);
}
return 0;
}
标签:arr,return,int,指针,include,define
From: https://blog.51cto.com/u_16425777/8986729