C语言总结:指针部分(经典指针,数组指针,指针数组,函数指针)

一.普通指针:

定义及理解:

  官方定义:普通指针是一个保存变量地址的变量。

  理解:每一个变量在内存空间中均对应着一个地址,指针指针,便是指向变量地址的一个变量。

  拓展:

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表示指针本身和它指向的值均为固定。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值