C/C++基础知识(一)——函数和结构体

2019-10-12  本文已影响0人  王志强_9380

指针函数

定义:指针函数是指带指针的函数,本质是一个函数。函数返回类型是某一类型的指针
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

上一篇 下一篇

猜你喜欢

热点阅读