目录
一、C语言指针
本文用到ARM汇编指令,请参考:
本文用到编译器为在线编译器(ARM-GCC):
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上的数据,为什么,因为指针变量的本质就是一个地址,所以在操作权限范围内以及不考虑程序奔溃的情况下,计算机中拥有地址的都可以用指针来指向访问。