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

指针是什么?

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

为什么需要指针

由于各种原因(局部变量函数结束会释放,static 的函数在其他文件访问不到等)可能你操作不了你想要操作的那块内存,
但是通过指针(即知道了地址)就可以想怎么操作就怎么操作。
例如:
1、通过形参(b)修改实参(a)的值。直接传值给形参(b)的话,是值的拷贝,就是b的值和a的值一样,然后函数中实际操作的是b,
   不会影响到a。但是如果把a的地址(指针)传进去,那b的值是a的地址,操作b就相当于去找到a然后再操作。
2、static函数外部文件访问不了。只要在外部文件中知道这个函数的地址,就可以访问了。
	文件a.c如下:
	#include<stdio.h>
	int (*x)();		//定义一个指针x,指向返回值是int型的参数为空的函数
	static int aaa()
	{
		printf("hahahaha\n");
	}
	int bbb()
	{
		printf("addr of aaa is %p\n",aaa);
		x = aaa;				//保存static函数aaa的地址
	}
	文件b.c如下:
	#include<stdio.h>
	extern int (*x)();
	extern int bbb();
	int main(int argc,char**argv)
	{
		bbb();
		printf("addr of x is %p\n",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]);
这两种写法等价 ,  第二种可读性更强
发布了38 篇原创文章 · 获赞 17 · 访问量 4318

猜你喜欢

转载自blog.csdn.net/qq_14877637/article/details/87004569