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
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342