STM32——C语言知识点:指针、结构体

  1 /*
  2  ============================================================================
  3  Name        : Cyuyanfuxi.c
  4  Author      :
  5  Version     :
  6  Copyright   : Your copyright notice
  7  Description : Hello World in C, Ansi-style
  8  ============================================================================
  9  */
 10
 11 #include <stdio.h>
 12 #include <stdlib.h>
 13 //函数声明
 14 void reset(int i);
 15 void reset2(int* p);
 16 void add_by_point(int x,int y,int *result);
 17 //结构体定义
 18 struct student
 19 {
 20             int age;
 21             float weight;
 22             char name[20];
 23 };
 24 void struct_caculate(struct student *p);
 25
 26 int main(void)
 27 {
 28     //求类型的字节
 29     printf("%d\n",sizeof(char));//1字节
 30     printf("%d\n",sizeof(int));//4字节
 31     printf("%d\n",sizeof(float));//4字节
 32     printf("%d\n",sizeof(double));//8个字节输出p1,也就是a的地址
 33     puts("1------------------------------------------");
 34     int a = 10;//定义一个整型变量a,并赋值为10
 35     int *p1 = &a;//定义一个指针*P1,赋值为变量a的地址,
 36     char *p2 = p1;//定义一个字符变量p2,赋值为p1的地址
 37     printf("%d\n",p1);//输出p1,也就是a的地址(2686776)
 38     //运算要根据类型
 39     printf("%d\n",p1+1);//输出4210696,也就是2686776+4,因为p1是int类型4字节,所以加4
 40     printf("%d\n",*p1);//带*号的意思是输出p1里面的内容,10
 41     printf("%d\n",*p2);//10
 42     puts("2------------------------------------------");
 43     int code[10] = {1 ,2,3,4,5};//定义一个数组
 44     //结论:数组内容值默认为0
 45     printf("%d\n",code[5]);//输出数组的第5个值,但是数组只有第4个,数组有定义10个,那么数组内容默认为0
 46     //结论:数组名也是数字首地址
 47     printf("%d\n",code);//求数组名的地址                                   2686732    发现一样的
 48     printf("%d\n",&code[0]);//求数组的第一个数字的地址     2686732
 49     //指针运算要根据指针的类型
 50     printf("%d\n",code+1);//求数组加一的地址,输出2686732+4
 51
 52     printf("%d\n",*(code+2));//求数组第三个数字的值,3
 53     *(code+2) = 0;//(code+2)是一个地址,*(code+2)是内容,现在把0赋值为里面的内容
 54     printf("%d\n",*(code+2));//0
 55     puts("3------------------------------------------");
 56     int d = 10;
 57     reset(d);//函数的调用
 58     //结论:函数的独立性,
 59     printf("%d\n",d);//10
 60     reset2(&d);//取地址
 61     //使用指针的方式突破函数壁垒
 62     printf("%d\n",d);//0
 63     //什么是返回值
 64     int e = add(3,5);
 65     printf("e = %d\n",e);//8
 66     int result = 0;//??
 67     //指针的方式计算结果
 68     add_by_point(5,5,&result);
 69     printf("result = %d\n",result);//10
 70     puts("4------------------------------------------");
 71     printf("student结构体字节数 = %d\n",sizeof(struct student));//4+4+20=28
 72     struct student kinson = //结构体赋值
 73     {
 74             21,61,"kinson"
 75     };
 76     printf("%d\n",sizeof(kinson));//28
 77     printf("%d\n",&kinson);//取结构体名kinson的地址2686692
 78     //结构体指针运算根据指针的类型来判断
 79     printf("%d\n",(&kinson+1));//2686692+28=2686720
 80     //结构体的地址就是第一个成员的地址
 81     printf("%d\n",&kinson.age);//2686692
 82     //结构体成员的地址是连续的
 83     printf("%d\n",&kinson.weight);//2686696
 84     printf("%d\n",&kinson.name);//2686700
 85
 86     //printf("%d\n",kinson.name);
 87     puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
 88
 89     return EXIT_SUCCESS;
 90 }
 91 void reset(int i)//定义一个子函数
 92 {
 93     i = 0;//赋值i=0;
 94 }
 95 void reset2(int* p)//定义一个指针函数
 96 {
 97     *p = 0;//指针p的内容是0
 98 }
 99
100 int add(int i,int j )//定义一个子函数,什么是返回值要用
101 {
102     /*
103       变量的生命周期
104      */
105
106     int q = i+j;
107     return q;
108 }
109 void add_by_point(int x,int y,int *result)//指针函数要用
110 {
111     int r = (x + y);
112     *result = r;
113 }
114
115 void struct_caculate(struct student *p)
116 {
117
118     p->name = "kinson2";
119
120
121 }

时间: 2024-10-12 07:25:30

STM32——C语言知识点:指针、结构体的相关文章

C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 本文由 arthinking 发表于315 天前 ⁄ itzhai.com原创文章 ⁄ C语言 ⁄ 评论数 3 ⁄ 被围观 1,775 views+ 指针数组: 在一个数组中,如果它的元素全部都是指针类

浅谈c语言typedef 与结构体指针(个人小经验)

 #include<stdio.h> #include<string.h> typedef struct emp{ char sex[8]; char name[15]; int age; }*emp;//这里我们用typedef把emp这个结构体变成了*emp这种指向结构体成员的结构体指针 /*typedef struct emp{ char sex[8]; char name[15]; int age; }pi,*emp;//为了程序的可读性最好不要这样声明*/ int m

linux 中 C 语言的使用 -- 结构体多态

在 Linux 内核代码,特别是驱动代码中经常见到的用法是使用一个标准结构,后面的代码基于这个结构来实现,类似面向对象的多态特性. 在 C 语言里面借助结构体和函数指针实现的这个功能,这里我们写了个例子,提取了关键代码: #include <stdio.h> struct s_new{ char name[10]; char* (* my_method)(char *name); }; char* powerful(char *name){ printf("%s is powerfu

Go-常识补充-切片-map(类似字典)-字符串-指针-结构体

目录 Go 常识补充 Go 命名 打印变量类型科普 _ 关键字 命名规范相关 包目录规范 切片 多维切片 切片初始化的方法 多维切片初始化 切片删除元素(会略微影响效率 ,少用) copy 函数 打散切片 循环打印多维切片 Map (类似 python 字典) map 定义及初始化 赋值.取值.改值 map 删除元素.参数传递 map 相等比较.循环遍历 字符串 字符串的定义.长度.遍历字节.字符 指针 向函数传递指针参数 传递数组指针 (最好是用切片) 结构体 结构体零值 匿名结构体 结构体指

9.Go语言基础之结构体

Go语言中没有类的概念,也不支持"类"的继承等面向对象的概念. Go语言中通过结构体的内嵌再配合接口,比面向对象具有更高的扩展性和灵活性. 1.类型别名和自定义类型 1.1自定义类型 在Go语言中有一些基本的数据类型,如string,整型,浮点型,布尔等数据类型,Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型.我们可以基于内置的基本类型定义,也可以通过struct定义. //将MyInt定义为int类型 type MyInt int 通过Type关

Go语言基础之结构体

Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型.我们可以基于内置的基本类型定义,也可以通过struct定义.例如: //将MyInt定义为int类型 type MyInt int 通过Type关键字的定义,

关于c语言中的结构体使用偏移量求值问题

最近在看nginx源码,看到定时器的时候,发现一个结构体利用偏移量求值问题, 结构体相信做c开发的都遇到过,那么不知你对结构体中成员变量偏移这块是如何理解的; 首先我们先看一下nginx中的那个让我迷惑的地方 ev =    (event_t*)((char*)node - offsetof(event_t, timer)); 这里,可以得知道是利用event_t结构体的timer变量,来反求event_t结构体的地址 说明一下: event_t是一个结构体 node 也是一个结构体 timer

C语言中的结构体,结构体数组

C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存对齐的问题.也就是内存里面会有空档. 1.结构体的定义和赋值 结构体是可以直接初始化的,在定义的时候,就可以初始化,而且如果你的结构体中恰好有字符数组的话,这个时候初始化是不错的选择,原因很简单,字符数组只能定义的时候直接初始化 后来就不可以了,后来你就只能用strcpy函数来拷贝初始化了. str

黑马程序员 C语言-枚举,结构体,指针

一.枚举 ※枚举变量的定义 前面只是定义了枚举类型,接下来就可以利用定义好的枚举类型定义变量. 跟结构体一样,有3种方式定义枚举变量 1.先定义枚举类型,再定义枚举变量 enum Season {spring, summer, autumn, winter}; enum Season s; 2.定义枚举类型的同时定义枚举变量 enum Season {spring, summer, autumn, winter} s; 3.省略枚举名称,直接定义枚举变量 enum {spring, summer