变量解析 | C语言

变量的定义与赋值

编程语言中有一个比较容易混淆的概念就是“变量的地址”与“变量的值”。因为在编程语言中我们用同一个标号来表示这两个东西,由编译器根据上下文判断它的具体含义。

让我们看下最简单的变量的定义与赋值:

int a;      // 1
a = 9;      // 2
  • 第1行,表示定义了一个变量a。对于编译器来说,编译器为a分配一个地址,这个地址代表一个存储空间,空间中存储的数据的类型是int
  • 第2行,表示赋值,把9赋值给变量a。即程序运行时,通过变量a的地址找到存储空间,然后向存储空间中写入9。

这个存储空间可以用下图表示,这里假设编译器分配给a的地址为C9420
image

再来看一组表达式:

int a;      // 1
a = 9;      // 2
int* b;     // 3
b = &a;     // 4
  • 第1行,见上例。
  • 第2行,见上例。
  • 第3行,表示定义了一个变量b。对于编译器来说,编译器为b分配一个地址,这个地址代表一个存储空间,空间中存储的数据的类型是int *
  • 第4行,表示赋值,把a的地址赋值给b。即程序运行时,通过b的地址找到存储空间,然后向存储空间中写入一个数据,这个数据是a的地址。

这个存储空间可以用下图表示,这里假设a的地址为C9420,b的地址为CC004
image

通过上面两个例子可以看出来这几个因素与变量有关:
* 变量的地址
* 变量的值
* 变量的类型

变量的地址用于寻找存储空间,存储空间存放变量的值,该值的类型由变量的类型来定义。

sizeof

sizeof不是函数,是c语言中的一元运算符。它用来计算一个对象或者一个数据类型所占用的空间大小,单位为char所占用的字节。

以下例子,我们假设char类型占用1字节,int占用4字节,指针占用4字节。

int a = 0;
char b = 't';
char* c = &b;
int arr[9] = {0};
int* p_arr = arr;

printf("%d, %d, %d, %d\n", sizeof(char), sizeof(int), sizeof(char*), sizeof(int*));         // 结果为 1, 4, 4, 4
printf("%d, %d, %d, %d, %d\n", sizeof(a), sizeof(b), sizeof(c), sizeof(arr), sizeof(p_arr));// 结果为 4, 1, 4, 36, 4
  • int占用4个字节的存储空间,a的类型为int,所以sizeof(a)等于4。
  • char占用1个字节的存储空间,b的类型为char,所以sizeof(b)等于1。
  • 指针占用4个字节的存储空间,c的类型为指针,所以sizeof(c)等于4。
  • arr是一个数组,sizeof(arr)计算的是整个数组占用的空间,所以等于36。
  • 指针占用4个字节的存储空间,p_arr的类型为指针,所以sizeof(p_arr)等于4。

再来看结构体的例子:

struct test {
    int a;
    char b;
};

sizeof(struct test)的结果可能是8而不是5,这里涉及到字节对齐。

更多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值