之前一直在做嵌入式相关的开发,已经有十年时光了, 之前有朋友问我C语言指针的问题, 然后我就想在这里写一下。
说到C语言,精华我认为是指针和结构体,如果这俩个不会使用那么就不能真正说自己会C语言,更不能胜任嵌入式开发。
话不多说,开门见山。
首先指针是啥?指针其实是地址的。 可以是某个int \char等变量的地址,也可以是函数的地址,数组的地址,结构体的地址。 通过指针就可以访问到地址上面的内容
1、int *a;//这个大家都很好理解,定义一个指针,这个指针指向的是一个整型的地址。 所以我们称之为整型指针.
2、int *a[10];//这个是啥? 我们一步步分析看
(1 首先主体是a, 在C语言中[]的优先级比 * 优先级高,所以a先和[]结合.
(2 a和[10]结合, a[10]就是一个数组,这个是数组元素有10个
(3 然后a[10]的元素类型是什么呢? 这个时候看int *, 我们就确认元素类型是整型指针
(4 综上所述,a是一个数组,数组元素是整型指针, 换句话说a是个数组,数组名字是指针数组
3、 int ( * a)[ 10];// 括号的优先级比[ ]高,所以a和*先结合,所以a肯定是一个指针了;
因为a是指针,那么他到底指向的是谁? 后面的[10]表示指针是指向一个有十个元素的数组了,并且这个数组元素是int类型。
所以a是一个指针,指针指向是一个数组地址, 所以就是数组指针
4、int *a(int, char);//a肯定是一个函数了,函数俩个参数,一个参数类型是int,一个是char; 然后这个函数返回值是int类型指针。
5、int ( * a)(int, char);//a先和 * 集合, 那么a是一个指针,指针到底指向什么? 后面的(int, char)告诉我们指向的是一个函数, 这个函数返回值是什么? int?
6、int * const a;// const 修饰a, a又是一个指向int的地址。 那么a指向的地址是不是就不能变了?但是指向的地址里面的内容可以变吗?
比如a 指向的地址0x12345678,这个地址上面保存的值是5。 那么我可以把a修改成指向地址0xaacc吗?假如不能的话, 那我可以把原先0x12345678地址上面的内容5改成6吗?
7、const int *a;// const修饰int。 那么指针a指向的地址内容是不能变的,但是我可以改变指针a指向的地址。
8; char *a=“ancdefg“; //我们不可以a[1]='G’进行修改,因为此时a是一个字符串常量!!!!