一.普通指针:
定义及理解:
官方定义:普通指针是一个保存变量地址的变量。
理解:每一个变量在内存空间中均对应着一个地址,指针指针,便是指向变量地址的一个变量。
拓展:
1.指针指向的是虚拟内存地址,原因在于需要保证安全性(恶意访问地址)以及可移植性(在不同硬件设备上运行(通过操作系统提供的虚拟内存对接物理内存的接口))
2.指针本身会占 用空间(常见4字节或8字节),这一点也便于理解多级指针。
3.数组+1便是加上了数组所指向元 素所占用的字节数。
4.数组指空会崩(指了个寂寞)。
5.指针的类型决定了它所指向的对象的解释方式。例如,如果有一个 int
类型的指针,那么当它被解引用时,它所指向的内存位置会被解释为一个整数。同样,如果有一个 char
类型的指针,那么解引用时,内存位置会被解释为一个字符。
6.指针本身并不包含关于它所指向的元素的任何信息。它只是一个内存地址。这意味着你可以将一个 int
类型的指针强制转换为其他类型的指针,但这并不改变它所指向的实际内存内容。
运用:int n=0;int *p=&n;
二:数组指针:
定义及理解:
官方定义:指向数组首元素的地址的指针。(与二级指针有相似性)
理解:为什么数组指针与二级指针有相似性?原因在于数组本身就存储着一个或多个变量,数组名对应着数组首元素的地址,而指向数组首元素地址的指针,便于二级指针有着相似性(数组首元素与一级指针有相似性。)
拓展:1.数组指针+1等同于加上了整个数组的字节。
2.同理,数组指针不能指向一个不含有任何元素的数组(根本建不起来这数组)。
3.指向数组的指针可以被设置为NULL,表示它不指向任何有效的数组,意味着暂时建立,但不做具体指向。
应用:int arr[3]={1,2,3};
int (*p)[3]=&arr;(奇奇怪怪,但我也没有办法。)
三:函数指针:
定义及理解:
官方定义:函数指针是一个指向函数的指针变量,它可以指向某个函数的入口地址,使得程序可以通过该指针变量调用该函数。函数指针本身是一种数据类型,其类型与所指向函数的返回值类型和参数类型有关。
理解:函数的入口地址?大道至简,到了0101层面肯定会有个地址。
拓展:1.函数指针还可以被放在数组中,形成函数指针数组,这提供了一种灵活的方式来管理和组织函数。
2.函数指针无法+1,-1,如此行径只会指向其他函数
3.函数指针可以作为函数的参数,这种用法常用于回调函数。
示例:#include <stdio.h>
void print_int(int x) {
printf("%d\n", x);
}
void process_int_with_function(int x, void (*func)(int)) // 定义函数,接受一个整数和一个函数指针 {
func(x); // 在这个函数内部,调用传入的函数指针
} //能否理解为虚拟函数?
int main() {
process_int_with_function(10, print_int);
return 0;
}
应用:
int add(int a,int b);
int (*p)(int,int)=add;
add(1,2);
p(1,2);
四:指针数组:
定义及理解:元素为指针的数组(谁说数组里面只能是数或者字符?)。
应用:int a=1;
int *arr[4];
arr[0]=a;
四:const与指针
const int *p表示指向固定值的指针
int *const p表示指针本身是固定的,即不能改变指针指向的地址
const int *const p表示指针本身和它指向的值均为固定。