初识C语言(四)(C语言初阶)

目录

12、#difine定义常量和宏

13、指针

13.1、内存(地址)

13.2、如何取出地址

13.3、地址的储存

13.4、其他类型的指针和指针大小

14、结构体


12、#difine定义常量和宏

#include<stdio.h>

//#define定义的标识符常量
//NUM —— 这串字符就相当于一个常量 —— 2000
#define NUM 2000

//#define定义的的宏 —— 用#define定义的宏来实现两个数的相加
#define Add(x, y) ((x)+(y))

//用函数来实现两个数的相加
int ADD(int x, int y)
{
	return (x + y);
}

int main()
{
	int a = 10;
	int b = 20;
	int c = NUM;
	printf("%d\n", c);     //打印值2000
	int sum1 = ADD(a, b);
	printf("%d\n", sum1);     //打印值30
	int sum2 = Add(a, b);
	printf("%d\n", sum2);     //打印值为30
	return 0;
}

 其中的#define Add(x,y) ((x)+(y))中的括号不要省略

以防出现意料之外的结果:

就比如一下的代码

#include<stdio.h>

#define Add(x, y) ((x)+(y))
#define ADD(x, y)  x+y

int main()
{
	int a = 10;
	int b = 20;
	int sum1 = 2 * Add(a, b);
    int sum2 = 2 * ADD(a, b);
	printf("%d\n", sum1);     //打印值为60
    printf("%d\n", sum2);     //打印值为40
    return 0;
}

13、指针

13.1、内存(地址)

(1)内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。

(2)所以为了有效的使用内存,就把内存划分成一个个小的内存单元每个内存单元的大小是1个字节。

(3)为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。

 

(4)补充:

前面有0x的数 —— 表示16进制的数字 —— 2个位数的16进制数 = 8个位数的2进制数(举例:16进制 —— FF 和 2进制 —— 11111111 表示的数相等)

在32位平台下:有32个地址线,每个地址线能够给出0或1,则能够给出2的33次方 - 1个 编号地址

2的33次方字节 = 4,294,967,296byte = 4,194,304kb = 4096mb = 4gb

所以在32位平台下(32个地址线):内存最大为4GB。

如果想要增大内存就要增加地址线,可以用64位的平台。

13.2、如何取出地址

利用&(取地址)操作符

#include<stdio.h>
int main()
{
	int num = 0;    //&num —— 取出num的地址
//num是一个整型,一个整型是4个字节,取出的是第一个字节的地址
	printf("%p\n", &num);   //%p —— 取地址 —— 以地址的形式打印
	return 0;
}

补充:

%d —— 以整型的形式打印

%c —— 以字符的形式打印

%s —— 以字符串的形式打印

%f —— 以单精度浮点型的形式打印

%lf —— 以双精度浮点型的形式打印

%p —— 以地址的形式打印

%lld —— 以更长整型的形式打印

 

13.3、地址的储存

地址的储存需要定义指针变量

以整型指针为例:

#include<stdio.h>
int main()
{
	int num = 0;
	int* p;   //定义指针变量,(int* p)其中*表示p是指针变量,int表示p指针变量的类型是整型
	p = &num;   //p是指针变量,用于存放地址 —— 这里存放的是num的地址。
	*p = 10;   //*是解引用操作符,可以根据地址来找到地址存放的内容
	return 0;
}

补充:

(int* p)中的‘ * ’和*p = 10中的‘ * ’中的意义不相同

(int* p)中的‘ * ’表示p是指针变量

*p = 10 中的‘ * ’表示解引用操作

13.4、其他类型的指针和指针大小

char* p  //字符指针
int* p  //整型指针
short* p  //短整型指针
long long* p  //长整型指针
float* p  //浮点型指针
double* p  //双精度浮点型指针

当然还有数组指针等等一系列的指针(后面讲)

include <stdio.h>
int main()
{
    printf("%d\n", sizeof(char *));  //4
    printf("%d\n", sizeof(short *));  //4
    printf("%d\n", sizeof(int *));  //4
    printf("%d\n", sizeof(double *));  //4
    return 0;
}

 指针的大小是4个字节或者是8个字节(这个取决于你是用的是32位平台(4字节)还是64位平台(8字节))

指针变量是用来存放地址的,地址就是编号 —— 编号大小取决于平台 —— 所以指针大小取决于平台大小

14、结构体

结构体是C语言中特别重要的知识点,结构体能够描述复杂类型的变量。

比如描述书,书包含:书名 + 价格 + 书号, 这几项信息。

这里只能使用结构体来描述了

#include<stdio.h>

struct Book  //自定义书类型
{
	char name[20];  //书名
	float price;    //价格
	char id[20];    //书号
};

void Print(struct Book* pb)
{
	printf("%f\n", pb->price);  //(->)操作符 —— 结构体地址 -> 成员名
	printf("%s\n", (*pb).id);   //(*pb).id 和 pb->id表示的意思相同
}

int main()
{
	struct Book b = { "C语言程序设计", 45.5f, "C00110101" };
	Print(&b);   //打印函数
	printf("%s\n", b.name);  //(.)操作符 —— 结构体变量 . 成员名
	return 0;
}

 打印的内容为:

 

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT技术博主-方兴未艾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值