指针
在C语言中,指针是一种特殊的变量,它存储的是另一个变量的内存地址。
指针变量的定义和使用
指针的类型取决于它所指向的变量的类型。例如,如果一个指针指向一个整型变量,那么它的类型就是 int*。常见的指针类型包括int*, char*, float*, double*等。 `
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void test01()
{
int a = 10;
//定义一个指针
int* p;
//建议指针和变量的关联
p = &a;
printf("&a=%d\n", &a);
printf("p=%d\n", p);
//指针的操作
*p = 100;
printf("a=%d\n", a);
printf("*p=%d\n", *p);
}
int main()
{
test01();
system("pause");
return 0;
}
`
指针所占内存的空间
`
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//指针的大小
void test01()
{
printf("sizeof int * =%d\n", sizeof(int*));
printf("sizeof char * =%d\n", sizeof(char*));
printf("sizeof float * =%d\n", sizeof(float*));
printf("sizeof double * =%d\n", sizeof(double*));
}
//在32位操作系统下 指针通常是占用4个字节
//在64位操作系统下 指针通常占用8个字节
int main()
{
test01();
system("pause");
return 0;
}
`
空指针和野指针
空指针
空指针是一个特殊值,表示指针不指向任何有效的内存地址。在C语言中,空指针通常用宏 NULL 表示,NULL 的值通常是(void*)0 或 0。
特点:
-
安全性:空指针不会指向任何实际的数据,因此尝试通过空指针访问数据会导致程序崩溃(通常是段错误)。
-
用途:空指针常用于表示“没有数据”或“无效地址”的状态,有助于防止对无效内存的访问。
void test01() { int* p = NULL; //本质就是0 //内存地址编号0~255之间被系统占用 不可以访问 //printf("%d\n",*p); }
野指针
野指针是指那些没有被初始化或已经失效但仍指向不确定地址的指针。野指针的危险性在于它们可能会指向任意的内存位置,访问这些位置可能导致不可预测的行为,甚至程序崩溃。
特点:
- 不确定性:野指针指向的地址是不确定的,可能是有效地址也可能是无效地址。
- 风险:通过野指针访问或修改内存可能导致程序崩溃、数据损坏或其他未定义行为。
野指针的常见来源:
-
未初始化的指针:声明了指针但未初始化。
-
释放后的指针:指针指向的内存已经被释放,但指针仍然保留着原来的地址。
-
数组越界:指针超出数组边界。 `
void test02() { //利用指针变量p执行非法内存空间 0x11100 int* p = 0x11100; //printf("%d\n",*p); } void test03() { int* p; *p = 100; printf("%d\n", *p); }
`
const修饰指针
`
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//1.const修饰指针 称为常量指针
void test01()
{
int a = 10;
const int* p = &a;
//*p=20;error 指针指向的数不可以修改
int b = 20;
p = &b; //指针的指向可以修改
}
//2.const修饰常量 称为指针常量
void test02()
{
int a = 10;
int* const p = &a;
*p = 20; //指针指向的值 可以修改的
int b = 20;
//p = &b; //error 指针的指向不可以修改
}
//3.const修饰指针和常量
void test03()
{
int a = 10;
const int* const p = 10;
//*p = 20; //指针指向的值不可以修改
int b = 20;
//p = &b; //error 指针的指向不可以修改
}
int main()
{
test03();
system("pause");
return 0;
}
`