指针函数
定义:指针函数是指带指针的函数,本质是一个函数。函数返回类型是某一类型的指针
int *f(x, y);
例子
int* func_point(void* mParam) {
printf("指针函数 \n");
int b = 10;
int* p = &b;
return p;
}
int a = 10;
func_point(&a);
函数指针
定义:函数指针是指向函数的指针变量,本质是一个指针变量
int(*f)(int x);
f = func;
例子
void (*funcp)();
void funcp_point() {
printf("函数指针 \n");
return;
}
funcp = funcp_point;
指针数组
*p[n]
void func_pointarr1() {
printf("指针数组 \n");
int arr[] = { 100, 200, 300 };
int* p[3];
for (int i = 0; i < 3; i++) {
p[i] = &arr[i];
}
for (int i = 0; i < 3; i++) {
printf("*p[%d]=%d \n", i, *p[i]);
}
}
输出结果为:
指针数组
*p[0]=100
*p[1]=200
*p[2]=300
数组指针
int (*p)[n]
也称为行为指针,优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个数组的长度是n,也就是说这个n是p的步长。当执行p+1时,p要跨过n个整型数据的长度
int a[3][4];
int (*p)[4];//定义一个数组指针,指向含4个元素的一维数组
p=a; //将二维数组首地址赋值给p,也就是a[0]或&a[0][0]
p++; //执行之后,指向了a[1][]
内存对齐
对齐跟数据在内存中的位置有关,如果一个变量的内存地址正好位于它长度的整数倍,他就被称作自然对其。比如在32位cpu下,假设一个整型变量地址为0x00000004,那它就是自然对齐的
结构体
结构体存储原则
- 结构体变量中成员的偏移量必须是成员大小的整数倍
- 结构体大小必须是所有成员大小的整数倍,也就是所有成员大小的公倍数
struct MyStruct
{
int a;
short b;
} s1, s2;
void func_struct() {
MyStruct myStruct;
myStruct.a = 1;
myStruct.b = 2;
s1.a = 11;
s1.b = 22;
s2.a = 33;
s2.a = 44;
printf("结构体大小:%d \n", sizeof(MyStruct));
}
输出结果为:
结构体大小:8
共用体
共用体是一种特殊的数据类型,允许你在相同内存位置存储不同的数据类型。可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式
union UnionData
{
int a;
int c;
float b;
char str[20];
};
void func_union() {
UnionData unionData;
unionData.a = 1;
printf("unionData.a:%d \n", unionData.a);
unionData.c = 2;
printf("unionData.a:%d \n", unionData.a);
printf("共用体大小:%d \n", sizeof(UnionData));
printf("共用体a地址:%#x \n", &unionData.a);
printf("共用体b地址:%#x \n", &unionData.b);
}
输出结果为:
unionData.a:1
unionData.a:2
共用体大小:20
共用体a地址:0x268ff968
共用体b地址:0x268ff968
网友评论