#include <stdio.h>
/*
指针:地址。
内存单元:计算机中内存最小的存储单位——内存单元。大小一个字节。每一个内存单元都有一个唯一的编号。
称这个内存单元的编号为“地址”。
指针变量:存指针的变量。
*P:将p变量的内容取出,当成地址看待,找到该地址对应的内存空间。
如果做左值:存数据到空间中。
如果做右值:取出空间中的内容。
*/
int main0201(void)
{
int a = 10;
int* p = &a; // 指针变量p
*p = 250; // 指针的解引用、间接引用。
// 指针的大小与类型无关。只与当前使用的平台架构有关。 32位: 4字节。64位: 8字节。
printf("sizeof(int*) = %u\n",sizeof(int*));
printf("sizeof(char*) = %u\n", sizeof(char*));
printf("sizeof(short*) = %u\n", sizeof(short*));
printf("sizeof(void*) = %u\n", sizeof(void*)); // 泛型指针
return 0;
}
/*
野指针:
1)没有一个有效的地址空间的指针。
int *p:
*p = 1000;
2) p变量有一个值,但该值不是可访问的内存区域。
int和=10;
*p = 2000:
[杜绝野指针]
空指针:int *p = NULL;
*p时,p所对应的存储空间一定是一个无效的访问区域。
*/
int main0202(void)
{
//int* p;
//*p = 250; // 野指针。地址为随机数,不可访问。
int* p1=10; // 野指针。0-255是留给操作系统使用的。
*p1 = 200;
int* p2 = NULL; // 空指针。
if (p2 != NULL)
{
*p2 = 250;
}
return 0;
}
// 万能指针/泛型指针(void *);
// 可以接收任意一种变量地址。但是,在使用必须借助“强制类型转换”具体化数据类型。
int main0203(void)
{
int a = 10;
void* p = &a; // 万能指针、泛型指针
printf("*p = %d\n", *(int*)p); // 强制类型转换:int*
char ch = 'A';
void* p1 = &ch; // 万能指针、泛型指针
printf("*p1 = %c\n", *(char*)p1); // 强制类型转换:char*
return 0;
}
const
#include <stdio.h>
// 总结:const 向右修饰,被修饰的部分即为只读。
// 常用:在函数形参内,用来限制指针所对应的内存空间为只读。
// const int *p;------可以修改p,不可以修改*p
int main0301(void)
{
int a = 10;
int b = 20;
const int *p = &a;
*p = 20; // 不可以修改*p
p = &b; // 可以修改p
return 0;
}
// int const *p;------可以修改p,不可以修改*p
int main0302(void)
{
int a = 10;
int b = 20;
int const *p = &a;
*p = 20; // 不可以修改*p
p = &b; // 可以修改p
return 0;
}
// int* const p;------不可以修改p,可以修改*p
int main0303(void)
{
int a = 10;
int b = 20;
int* const p = &a;
*p = 20; // 可以修改*p
p = &b; // 不可以修改p
return 0;
}
// const int* const p; ------不可以修改p,不可以修改*p
int main0304(void)
{
int a = 10;
int b = 20;
const int* const p = &a;
*p = 20; // 不可以修改*p
p = &b; // 不可以修改p
return 0;
}