C语言基础知识--指针

目录

一、C语言指针

1、指针的本质

2、指针变/常量

3、指向变量指针基本用法

1)、代码示例如下

2)、代码分析

4、指向函数指针基本用法

1)、代码示例如下

2)、代码分析


一、C语言指针

本文用到ARM汇编指令,请参考:

ARM常用汇编指令_BIN-XYB的博客-CSDN博客

本文用到编译器为在线编译器(ARM-GCC):

Compiler Explorer

1、指针的本质

指针可以是一个变量,一个常量等,指针是一个数值,这个数值的含义是一个地址。指针变/常量中保存的地址值可以指向 栈空间上的变量,堆空间上的数据块,也可以指向程序中的函数入口(函数入口本质也是一个地址,关于函数详见:c语言基础知识--函数_BIN-XYB的博客-CSDN博客)。总之,只要是存储在计算机RAM和ROM上的数据皆可以用指针来指向其地址。

2、指针变/常量

就像变量一样,指针也有自己的空间,只不过指针变量的长度固定,固定为32bit(4Byte)。普通变量的长度根据变量类型的变化而变化,比如char类型的长度为1Byte,int类型的长度是4Byte等。

指针定义格式类似于:int *a;整形指针。char *b; 字符指针等等。

3、指向变量指针基本用法

1)、代码示例如下
#include <stdio.h>

int main()
{
    void *p = NULL;
	int test = 5;
	p = &test;
	printf("test:%d\r\n", test);
	printf("p:0x%x, *p:%d\r\n", p, *((int*)p));
    return 0;
}

运行结果如下: 

test:5
p:0x23e5b484, *p:5
2)、代码分析

void *p = NULL;    //定义指针变量。初始化为NULL(0)
int test = 5;     //定义整形变量,初始化为5。运行到这里时,编译器会为此变量在栈上开辟空间,长度为4Byte,所以此变量就有其存储数据的地址。

p = &test; //获取test变量的地址(在栈上),将其赋值给指针变量p,此时p中存储的值为test变量的地址。

4、指向函数指针基本用法

1)、代码示例如下
#include <stdio.h>

typedef void (*fun)(void);

void test_func()
{
	printf("test_func\r\n");
}

int main()
{
    fun p = NULL;
	p = test_func;
	p();
	printf("p:0x%x\r\n", p);
    return 0;
}

运行结果如下

test_func
p:0x401132
2)、代码分析

typedef void (*fun)(void);;    //定义函数指针类型。
void test_func();     //定义函数,函数中输出打印。

fun p = NULL; //定义原函数指针变量,初始化为NULL。

p = test_func;//将函数起始地址赋值给指针p。

p();//跳转到p指针指向的地址去执行。

二、总结

1、程序的本质是二进制数据组合,由编译器将人类可识别的自然语言编译为机器可识别的二进制数据。

2、计算机大体上都包含两种存储介质,一种是RAM,另一种是ROM。其中RAM支持随机读写,读写寿命基本无限,所以一般用来存放 程序运行过程中的会被动态修改的数据,比如栈数据,堆数据等等。而ROM有写寿命限制,且掉电数据不丢失,所以一般用来存放程序固件包,也就是我们编译后的二进制包。

3、指针变量基本是万能的,在权限允许情况下,可以指向RAM上的数据,也可以指向ROM上的数据,为什么,因为指针变量的本质就是一个地址,所以在操作权限范围内以及不考虑程序奔溃的情况下,计算机中拥有地址的都可以用指针来指向访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值