一.指针变量
1.1 什么是指针?
1.2 指针类型
1.2.1 指针的类型
1.2.2 指针不同类型的意义
1.2.3野指针
1.3 指针运算
二.
1.1
一.指针变量
1.1 什么是指针
简而言之,指针变量就是存储地址的,我们通过指针变量,也就是所存地址可以找到你所需要的数据。
举个列子助我们理解:在大学中,指导员管理那么多人,不可能每个人住那个寝室都知道,所以指导员找同学就要知道该同学的寝室号,也就是地址,根据地址找到该同学。
那么这个例子中,指导员管理同学就好比电脑管理数据一样,找到所需要的数据也需要知道该数据的地址,通过地址找到该数据,而指针变量便是存储地址的。
下面以代码形式展示:
#include<stdio.h>
int main()
{
int a=0;
a=9;
int*p=&a;//p就是一个指针变量,类型是int*
printf("%p\n",&a);
printf("%p\n",p);
printf("%d\n",*p);
return 0;
}
*p中的*是解引用操作符,就可以通过地址找到该地址存储的数据,
展示:
1.2 指针类型
1.2.1 指针的类型
了解了什么是指针之后,就要具体讲讲它的类型了,
就如int*p=&a; int*就说明p是一个指针变量,int*中的int则说明该指针指向的地址存储的数据是int类型。诸如此类,还有char* 、float* 、void*hy等等,大家可以举一反三去理解。
但是这些指针类型并不像基本类型一样,指针类型只与32位64位环境下有所区别,同意环境下所大小是一样的:
32位对应4字节
64位对应8字节
下面是64位环境下的代码展示
1.2.2 指针不同类型的意义
那么指针大小一样 ,不同指针类型有什么意义呢?
代码2:
int main()
{
int a=0x11223344;
int *p2=(char*)&a;
*p2=0;
return 0;
}
代码1:
int main()
{
int a=0x11223344;
int *p1=&a;
*p1=0;
return 0;
}
1.2.3野指针
还有一种特殊的指针,即野指针:
野指针是指指向已经释放或未分配的内存的指针。在 C 语言中,指针是一种变量,它存储了内存地址。当指针指向的内存被释放或未分配时,该指针就成为了野指针。
野指针是一种非常危险的情况,因为它可能导致程序崩溃或产生未定义的行为。例如,当使用野指针进行读写操作时,程序可能会访问到错误的内存位置,导致数据损坏或程序崩溃。
为了避免野指针,需要在使用指针时非常小心。以下是一些避免野指针的方法:
1. 在使用指针之前,确保它已经被正确地初始化。
2. 在释放内存之后,将指针设置为 NULL ,以避免再次使用野指针。
3. 在使用指针时,使用 if 语句来检查指针是否为 NULL ,以避免使用野指针。
以下是一个简单的 C 语言程序,演示了如何使用指针和避免野指针:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
// 分配内存
ptr = malloc(10 * sizeof(int));
if (ptr == NULL) {
printf("内存分配失败\n");
exit(1);
}
// 初始化指针
for (int i = 0; i < 10; i++) {
ptr[i] = i;
}
// 输出结果
for (int i = 0; i < 10; i++) {
printf("%d ", ptr[i]);
}
printf("\n");
// 释放内存
free(ptr);
ptr = NULL;
// 再次使用野指针
for (int i = 0; i < 10; i++) {
printf("%d ", ptr[i]);
}
printf("\n");
return 0;
}
在这个程序中,首先使用 malloc 函数分配了 10 个整数的内存空间,并将指针 ptr 指向该内存空间。然后,初始化指针并输出结果。最后,使用 free 函数释放内存,并将指针设置为 NULL 。在释放内存之后,程序再次使用野指针进行读写操作,导致程序崩溃。
请注意,这个程序只是一个简单的示例,实际的程序可能更加复杂,需要更加小心地处理指针和内存管理。
1.3 指针运算
1.3.1指针加减整数
下面用代码展示指针运算:
首先,
pc的类型是char*,char的大小是1字节,所以pc+1就是地址+1,跳过一个char型
pi的类型是int* ,int的大小是4字节,所以pi+1就是地址+4,跳过一个int类型
举一反三可以知道加减整数就是看该指针所存储的地址指向类型,加减整数就是加减整数*类型大小。
1.3.2指针减指针
指针加指针是非法的,无意义,
补充知识点,sizeof(arr)中的数组名arr指的是整个数组的地址,&arr也是整个数组的地址 ,其余情况下单独的数组名就是该数组首元素的地址。
指针减指针,类如数组:
据上示代码可知:
指针相减的结果是它们之间的元素个数,这个数量的单位是指针所指向的数据类型的大小。