C系统梳理3——宏、指针、结构体

九、#define定义宏

这里详细说一下#defne定义的常量和宏有什么区别。首先附上一段代码:

//定义的常量
#define PI 3.14
//定义的宏
#define ADD(x,y) (x+y)

#include<stdio.h>

int main ()
{
    int r=0;
    double s=0;
    scanf("%d",&r);
    s = PI*r*r;
    printf("半径为%d的圆的面积为:%.2f\n",r,s);

    int sum = 0;
    sum = ADD(1,2);
    printf("%d\n",sum);
   
    return 0;
}

运行结果
对于定义的常量来说,就只是一个需要重复访问的确定的值。比如说上面的圆周率PI等;

对于定义的宏来说,它是有参数的,由圆括号括起来的表达式。当然这个表达式也是可以重复使用的,比如上面的加法表达式。

十、指针

指针在我刚学C语言时觉得很难,很绕。。。但是当真的更深的去理解了它的含义时,就可以明白很多之前不会的。

首先,计算机所有程序都是在内存上去执行的,为了更加有效的使用内存,就划分出了内存单元(一个内存单元大小为1字节)。为了方便有效访问,就给每个内存单元编号,这就是内存单元的地址,在内存中一般以十六进制(0X)的方式存储。为了存放这些地址,就创造出了指针变量。

这里一般会用到两个操作符: * 叫解引用操作符, & 叫取址操作符

int a = 0;
int * p;                          //定义了一个指针变量p,它的指向类型为整型
p = &a;                           //将a的地址赋给p,即p这个指针变量指向a的地址
printf("%p\n",p);                 //打印出来的就是p的值,即a的地址( printf("%p\n",&a);这两句是一个意思)

*p = 10;                          //这里使用了解引用操作符,*p通过地址找到a,就相当于给变量a赋值为10

指针变量的大小(即它所占的内存大小)取决于使用的计算机的系统类型,如果处理器是32位,指针变量就占4个字节;若是64位,就占8个字节。注意:与其指向的类型无关

十一、结构体

现实生活中,有很多事物不能使用单一的数据类型去表示,这时就创造了一种复杂的数据类型———结构体。用来表示一些较复杂的事物。下面用人的基本属性来实例说一下结构体的声明、定义和初始化及成员的调用。

//结构体声明
struct hum
{
	char name[20];
	char sex[8];
	int age;
};    //结构体格式,定义完属性后,一定记得给大括号加分号

//结构体定义、初始化及使用
int main()
{
	struct hum h1 = { "张三","男",22 };    //初始化
	printf("name:%s sex:%s age:%d\n", h1.name, h1.sex, h1.age);    //使用方法1
	struct hum * ph1 = &h1;    //定义结构体指针
	printf("name:%s sex:%s age:%d\n", ph1->name,ph1->sex,ph1->age);    //使用方法2
	return 0;
}

由上可知,调用成员变量有两个方法:

  • 使用方法1-----使用 “对象.成员” 的格式
  • 使用方法2-----定义结构体指针,使用 “指针->成员” 或者 “(*指针).成员” 的格式

再说一个点,结构体传参,也有两个方法和调用成员变量对应——结构体传参、结构体地址传参,附上代码:

#include<stdio.h>
struct test
{
	char name[20];
	int age;
};
struct test h1 = { "zuo",21 };
//结构体传参
void print1(struct test h) {
	printf("直接传参:%d\n", h.age);
	return;
}
//结构体地址传参
void print2(struct test * ph) {
	printf("地址传参:%d\n", ph->age);
	return;
}
int main() {
	print1(h1);
	print2(&h1);
	return 0;
}

虽然直接传参和地址传参都可以,但是最好使用地址传参。因为函数传参时,需要压栈,若结构体过大时,直接传参传过来的是一整个结构体,那开销可想而知,性能自然也就会下降。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用\[1\]:C语言字节对齐问题详解中提到了C语言中的字节对齐问题。在结构体中,为了提高内存访问的效率,编译器会对结构体进行字节对齐。这意味着结构体的成员在内存中并不是紧凑排列的,而是按照一定的规则进行对齐。具体的对齐规则取决于编译器和编译选项。\[1\] 引用\[2\]:在C语言中,可以使用offsetof来获取结构体成员相对于结构体开头的字节偏移量。这个非常有用,可以帮助我们计算出每个结构体成员相对于结构体开头的偏移字节数。通过这个,我们可以更好地理解结构体的内存布局。\[2\] 引用\[3\]:在C语言中,指针结构体的组合常常用于处理复杂的数据结构。指针可以指向结构体的成员,通过指针可以方便地对结构体进行操作。指针结构体的组合可以实现更灵活的数据处理和内存管理。\[3\] 综上所述,C语言中的指针结构体组合可以用于处理复杂的数据结构,而字节对齐问题则是在结构体中为了提高内存访问效率而进行的优化。通过使用offsetof,我们可以更好地理解结构体的内存布局。 #### 引用[.reference_title] - *1* *3* [结构体指针,C语言结构体指针详解](https://blog.csdn.net/weixin_34069265/article/details/117110735)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C语言之结构体详解](https://blog.csdn.net/m0_70749276/article/details/127061692)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值