指针对于每一位初学者那是苦不堪言,我初学的时也是很头痛,我认为c语言重要的就是三块:指针、链表和函数,本人觉得此三块好比刘邦的三杰,在此我先声明,本文章没有涉及到链表的知识,此文主要是谈及指针函数、函数指针和数组指针、指针数组的区分以及结构体内存大小的计算
指针函数、函数指针和数组指针、指针数组的区分
首先这四个字有规律,最后两个字是什么说明这四个字主要是什么,可以把前两个字看成修饰词 如:指针数组,数组在后说明它是数组,把“指针”看成修饰“数组”的词
(指针)数组(指针):最重要的就是先找(),没有()再看[ ];
(指针)函数(指针):通常找左右(),复杂的如函数指针数组可能找[]但原理一样。
1. int *a[10];//没()看[]说明是数组,又有*(指针) 最终为指针数组(数组中的每一个元素都是指针)
2. int (*a)[10];//以此类推()里说明是指针,什么指针呢?后有[]说明是数组,最终为数组指针,指向数组元素的首地址。
3.int *fun();//这是个指针函数,没有形参
4.int (*fun)(int);//这是函数指针有一个int型的形参,函数返回值类型是int型
5.int (*s[10])(int) 表示的是什么?
/****************
*左()里说明是指针数组
*看右()说明是函数且有一个int型形参,
*最终可得出:表示的是函数指针数组,每个指针指向一个 int func(int param) 的函数
*****************/
结构体内存对齐
结构体内存对其三原则
若结构体的第一个成员数据类型是基本类型(比如:指针,int,char ,float double),内存分配是从整个结构体的内存分配偏移量为0处开始,下面依次的成员变量内存分配偏移量,根据它本身字节大小的倍数开始分配;
如果成员变量数据类型是复杂类型,比如数组,或者是结构体
//结构体
struct Student
{
int a;
char b;
double c;
};
那么内存分配偏移量是从结构体成员变量所占字节数最大的倍数开始分配
- 最后,总字节数必须是成员变量数据类型最大字节数的倍数
下面看两个例子:
struct Data
{
char ch; 0
int year; 4---7
};
int b=sizeof(struct Data);
printf("b=%d\n",b);
// b = 8
struct Stu
{
char ch; 0
int arr[10]; 4---43
int age; 44---47
};
int a=sizeof(struct Stu);
printf("a=%d\n",a);
// a = 48