《嵌入式LINUX与物联网软件开发 C语言内核深度解析》学习3——指针

2019-07-12 18:37发布

指针是什么?

指针全名叫指针变量,所以他是一个变量,但是它有点特别,就是它的值会被编译器当作地址来处理。你往里面存值1,编译器就会到地址为1的地方去找真正的值。

为什么需要指针

由于各种原因(局部变量函数结束会释放,static 的函数在其他文件访问不到等)可能你操作不了你想要操作的那块内存, 但是通过指针(即知道了地址)就可以想怎么操作就怎么操作。 例如: 1、通过形参(b)修改实参(a)的值。直接传值给形参(b)的话,是值的拷贝,就是b的值和a的值一样,然后函数中实际操作的是b, 不会影响到a。但是如果把a的地址(指针)传进去,那b的值是a的地址,操作b就相当于去找到a然后再操作。 2、static函数外部文件访问不了。只要在外部文件中知道这个函数的地址,就可以访问了。 文件a.c如下: #include int (*x)(); //定义一个指针x,指向返回值是int型的参数为空的函数 static int aaa() { printf("hahahaha "); } int bbb() { printf("addr of aaa is %p ",aaa); x = aaa; //保存static函数aaa的地址 } 文件b.c如下: #include extern int (*x)(); extern int bbb(); int main(int argc,char**argv) { bbb(); printf("addr of x is %p ",x); x(); //通过地址调用 aaa函数,这里叫x函数,不过他们是一样的,因为地址一样 } 编译:gcc a.c b.c -o out 运行:./out

高级语言如java、C#的指针去哪里了

指针还在,只是被封装起来了,程序员不能直接操作。跳过了指针这个难点。但是对频繁使用指针的底层开发而言,这些高级语言就有心无力了。

*号的作用

1、数值运算的”乘“ 2、定义指针变量 。int * a; 3、解引用(取空间操作)。*a就是取a变量中保存的地址上的值

NULL是什么

#ifdef _cplusplus #define NULL 0 #else #define NULL (void *)0 #endif

const变量真的不能修改吗?

可以修改,在程序运行过程中获取它的地址,通过指针进行访问并修改。 int const a = 10; a = 100;//这样不行,编译会报错 int *p = (int *)&a; *p = 100; //这样就可以了,a的值变成了100 char *q = "hello world"; //这里的"hello world" 才是真正的常量不可修改,它存储在常量区,该区域为只读

数组形参的写法

int func(char *p); int func(char p[100]); 这两种写法等价 , 第二种可读性更强