指针讲解

时间:2023-02-09 08:01:02

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//指针,地址指向变量单元
//对于32位机器,假设有32根地址线,产生2的32次方地址
//指针在32位平台是4个字节,在64位平台是8个字节

int *test()
{
int a = 10;
return &a;
}//程序结束的时候,这块空间已经释放了

int my_strlen(char* str)
{
char* start = str;
char* end = str;
while (*end != '\0')
{
end++;
}
return end - start;
}

int main()
{
int a = 0x11223344;
intpa = &a;
char
pc = &a;
printf("%p\n", pa);
printf("%p\n", pc);//输出结果相同

printf("%d\n", sizeof(char*));//4
printf("%d\n", sizeof(short*));//4
printf("%d\n", sizeof(int*));//4
printf("%d\n", sizeof(double*));//4


int a = 0x11223344;
int*pc = &a;//4个字节都变成了0
//char*pc = &a;//最右侧的1个字节变成了0
*pc = 0;
int*p *p能够访问4个字节
char*p *p能访问1个字节
double*p *p能访问8个字节
指针的类型决定了,对指针解应用的时候有多大的权限(能操作几个字节)
比如:char*的指针解引用就只能访问一个字节,而int指针的解应用就能访问4个字节

int a = 0x11223344;
int* pa = &a;
char*pc = &a;
printf("%p\n", pa);//0095fb58
printf("%p\n", pa+1);//+4个字节//0095fb5c
printf("%p\n", pc);//0095fb58
printf("%p\n", pc + 1);//+1个字节//0095fb59

指针类型决定了:指针走一步走多远(指针的步长)
int*p;p+1-->4字节
char*p;p+1-->1字节
double*p;p+1-->8字节

int arr[10] = { 0 };
int*p = arr;//改40个字节,在内存里面改
//char*p = arr;//改10个字节
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = 1;
}
怎么控制内存,给指针一个合理的类型

野指针:1无初始化的指针
int *p;
*p = 20;//局部的指针变量,就被初始化随机值

int arr[10] = { 0 };
int*p = arr;//arr代表首元素的地址
int i = 0;
for (i = 0; i < 12; i++)//2指针越界访问
{
p++;
}
//3指针使用之前检查有效性


int *p = test();//给这个*p地址重新申请的空间
*p = 20;//此时修改的已经是释放后的空间

规避指针方法
1.初始化地址
int *p=NULL//空指针
2.小心指针越界
3.指针指向空间释放即使置null
4.指针使用之前检查有效性
pa = NULL;//null是空指针=0
*pa = 10;//空指针是不能被访问的

指针运算
1.指针+-整数
2.指针的关系运算 比大小
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[9];
for (i = 0; i < 5; i++)
{
printf("%d", *p);//打印的是地址里放的值
p-=2;//首先是1的地址,加1就变成了2的地址
}

int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d\n",&arr[9] - &arr[0]);//指针大-指针小=中间元素个数;

strlen-求字符串长度
递归-模拟实现strlen-计数器方式1,递归方式2,

char arr[] = "bit";
int len = my_strlen(arr);//方法3
printf("%d\n", len);

for(vp=&valus[N_VALUES-1];vp>=&values[0];)
{
*--vp = 0;写这种是对的
}
for(vp=&valus[N_VALUES-1];vp>=&values[0];vp--)这种是错的
指针也是可以比较大小C语言比较--允许指向数组元素指针与指向数组最后一个元素后面的那个

内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位
置的指针进行比较

int arr[10] = { 0 };
printf("%p\n", arr);
printf("%p\n", arr+1);
printf("%p\n", &arr[0]);
printf("%p\n", &arr[0]+1);
printf("%p\n", &arr);
printf("%p\n", &arr + 1);

二级指针
int a = 10;
intpa = &a;
int**ppa = &pa;//二级,第2个
代表ppa是指针,第一个代表pa的类型是指针
int
**pppa = &ppa;//三级

指针数组//存放指针 int*

int a = 10;
int b = 20;
int c = 30;
int* arr2[3] = {&a,&b,&c};
int i = 0;
for (i = 0; i < 3; i++)
{
printf("%d\n", *(arr2[i]));
}
数组指针
return 0;
}