认识C语言③
九、#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;
}
虽然直接传参和地址传参都可以,但是最好使用地址传参。因为函数传参时,需要压栈,若结构体过大时,直接传参传过来的是一整个结构体,那开销可想而知,性能自然也就会下降。