C基础

前言:只会列举常用的,用不到的就不写了,太多了,学不过来;

一,数据类型

image.png

1. 结构体

// 结构体
typedef struct {
    unsigned int a; //unsigned无符号类型 正数
    int b;
} Person;

int main() {

    Person *person = malloc(sizeof(Person));
    person->a = 33;
    person->b = 22;

    printf("-----%d\n",person->a);
    printf("-----%d\n",person->b);
    return 0;
}

2.指针

int *p 在左侧 表示的声明一个地址变量 存的是地址

*p 在右侧 取的是一个指针变量地址 所指向的值,输出的是一个值

// 指针
//1, int *p 在左侧  表示的声明一个地址变量 存的是地址
//2, *p 在右侧  取的是一个指针变量地址 所指向的值,输出的是一个值

void test01() {
    int *p = 99;  //  *p 定义的是一个指针; 99指的是一个地址
    printf("------ %d\n", p);
    printf("------ %d\n", *p); //所以*p 是找不到值的

    //运行打印
    //------ 99
    //
    //Process finished with exit code -1073741819 (0xC0000005)
}
  • & 表示含义
//  * & 表示含义
void test02() {
    int *p;      //  *p 定义的是一个指针;
    int a = 10;  //  定义一个实体int变量 a,取值 为10;

    p = &a;      //  p  取a的地址赋值给p

    printf("------&a %p\n", &a);
    printf("------p  %p\n", p);
    printf("------&p %p\n", &p);
    printf("------*p %d\n", *p); //这里应该是10

    //运行打印
    //------ 000000000022FE14
    //------ 000000000022FE14
    //------ 10
}

指针大小 都一样大

void test03() {
    char *p;
    int *p3;

    printf("------ %d\n", sizeof(p));
    printf("------ %d\n", sizeof(p3));

    //------ 8
    //------ 8
}

指针是有类型的;

void test04() {
    int *p;
    *p = 100L; //demo1 运行会报错,为什么呢? *p 所指向的值是一个long类型;p是int指针

    // p = 100L; //demo2 为什么只有写不会错? 存的是一个地址,不是地址所指向的值;
    // 这个100L地址,具体存什么,这里是未知的
}

指针赋值问题 与步长问题

void test05() {
    int a = 0xaabbccdd;
    int *p1 = &a;
    printf("------*p1 %x\n", *p1); //demo1 预测打印的是aabbccdd;%x表示16进制的值;

    char *p2 = &a; //demo2 这样行吗?char 对应a的地址指向的是个int,和test04冲突?
    //可以的,1,*p = 100L;不行的原因是,你硬要在int 类型里面放long
    //       2,而&a只是一个地址,*p2取值的时候,只会取char大小的位置的值。后面的都不要了
    printf("------&a  %d\n", &a);
    printf("------*p2 %x\n", *p2);

    printf("------p1 %d\n", p1);
    printf("------p2 %d\n", p2);

    printf("------sizeof(int)  %d\n", sizeof(int));
    printf("------sizeof(char) %d\n", sizeof(char));

    // 步长问题,指针类型决定步长
    printf("------p1+1 %d\n", p1 + 1); //demo3; +1 结果是加几呢? 4
    printf("------p2+1 %d\n", p2 + 1); //demo4; +1 结果是加几呢? 1

    //打印
    //------*p1 aabbccdd
    //------&a  2293260
    //------*p2 ffffffdd
}

3.数组指针

//指向数组的指针(数组指针) , 一个特殊的指针,不用写*,存放的是指针类型
//数组 = 指针 指针 = 数组
//数组指针常量,只能取,不能再赋值

void test06() {
    int c[9] = {1, 6, 8, 3, 5, 2, 0, 1, 9};
    printf("------c  %p\n", c);
    printf("------&c  %p\n", &c);
    printf("------&c[0]  %p\n", &c[0]);
    printf("------*c %d\n", *c);
    printf("------*(c+1) %d\n", *(c + 1));

    int *p = c;
    printf("------p  %p\n", p);

    //数组 = 指针 指针 = 数组
    for (int i = 0; i < 9; ++i) {
        printf("------p[%d]  %d\n", i, p[i]);
        printf("------p+ %d  %d\n", i, p + i);//int 的步长是4;
    }

    //------c  000000000022FDE0
    //------&c  000000000022FDE0
    //------&c[0]  000000000022FDE0
    //------*c 1
    //------*(c+1) 6
    //------p  000000000022FDE0
    //------p[0]  1
    //------p+ 0  2293216
    //------p[1]  6
    //------p+ 1  2293220
    //------p[2]  8
    //------p+ 2  2293224
    //------p[3]  3
    //------p+ 3  2293228
    //------p[4]  5
    //------p+ 4  2293232
    //------p[5]  2
    //------p+ 5  2293236
    //------p[6]  0
    //------p+ 6  2293240
    //------p[7]  1
    //------p+ 7  2293244
    //------p[8]  9
    //------p+ 8  2293248
}

*arr = arr[0]

void test07() {
    int a = 10;
    int b = 20;
    int c = 30;
    int *p1 = &a;
    int *p2 = &b;
    int *p3 = &c;
    int *arr[3] = {p1, p2, p3};


    printf("------arr[0]  %d\n", arr[0]);
    printf("------*arr  %d\n", *arr); // *arr = arr[0]
    printf("------*arr[0]  %d\n", *arr[0]);
    printf("------**arr  %d\n", **arr);

    char *aa = arr;
    printf("------*((int *)aa)  %d\n", *((int *) aa));

    //------arr[0]  2293244
    //------*arr  2293244
    //------*arr[0]  10
    //------**arr  10
    //------*((int *)aa)  2293244
}

维数组

void test08() {
    int a[] = {10,20};
    int b[] = {50};
    int c[] = {30};
    int *arr[3] = {a, b, c};
    printf("------**arr = %d\n", **arr);

    //打印的是20 还是50呢?
    printf("------ *(*(arr+1)) = %d\n", *(*(arr+1))); //   为什么要多个*呢,这是二维数组,不然取的是地址

    //------**arr = 10
    //------ *(*(arr+1)) = 2293268
}

你可能感兴趣的:(C基础)