关于数组首地址

以前特意看过,但是还是会忘的,所以这次写下来,以后忘了就看看。


char test[10];

这是一个数组,数组名被解释为数组第一个元素的地址,也就是说test = &test[0]。但是对数组名用sizeof运算符的时候却计算的是整个数组的大小,不会把数组名解释为第一个元素的地址。但是sizeof对指向一个数组的指针来使用sizeof的时候得到的仅仅只是指针的大小。

并且将&运算符用在数组名上,返回的是整个数组的地址。,

那么也就是说

&temp + 1 和temp+1不是一回事。前者的增量是十个字节,而后者的增量是1个字节.

所以说,数组名一般来说会被解释为第一个元素的首地址,但是有几种情况不会。、

第一种,在用sizeof的时候

第二种,在使用取地址符的时候。

数组名被解释为地址,实际上是被解释的为第一个元素的地址,他和整个数组的首地址的值是相等的。

但是test 和 &test不是一回事,前者表示第一个元素的地址,数值上和数组首地址相等,后者虽然好像是对地址再取地址,即使一个指向数组的地址,相当于char(*)[10] = &test,但是他却得到的是整个数组的首地址,两者值相同,但是意义绝对是不同的,这点在上面+1那个例子就可以看出来。

### C语言中 `%p`、`%d` 和 `%s` 格式化字符的区别 #### `%p` 的作用 格式说明符 `%p` 主要用于打印指针变量的值,即内存地址。它通常以十六进制的形式展示地址值,具体的表示形式可能会因编译器或操作系统而有所不同。这种格式化字符对于调试非常有用,因为它可以帮助程序员追踪变量在内存中的具体位置[^1]。 示例代码如下: ```c #include <stdio.h> int main() { int num = 42; int *ptr = &num; printf("Pointer value: %p\n", (void *)ptr); // 输出指针地址 return 0; } ``` 在此代码片段中,`(void *)ptr` 被传递给 `printf()` 函数,确保不同类型指针之间的兼容性,并按十六进制格式显示该指针指向的内容所在的内存地址[^1]。 #### `%d` 的作用 相比之下,`%d` 是一种常用的格式化字符,用于输出有符号整数(signed integer),并以十进制形式呈现数值。当一个整型数据被传递给 `%d` 时,其会被解释为标准的十进制数字序列[^3]。 以下是使用 `%d` 的简单示例: ```c #include <stdio.h> int main() { signed int number = -789; printf("Signed Integer Value: %d\n", number); // 十进制输出 return 0; } ``` 这段代码会将 `-789` 正确解析为带正负号的常规十进制表达形式[^3]。 #### `%s` 的作用 最后来看 `%s`,这是专为字符串设计的一种特殊格式化字符。每当遇到 `%s` 时,系统会尝试读取紧随其后的参数作为指向字符数组起始处的有效指针,并逐一遍历直到找到终止符 `\0`,期间所有 ASCII 编码对应的文字字符都将被连续写入目标流中完成最终效果渲染工作流程[^3]。 下面是利用 `%s` 实现基本功能的一个应用案例: ```c #include <stdio.h> int main() { char greeting[] = "Hello World"; printf("%s\n", greeting); // 字符串输出 return 0; } ``` 在这里,“Hello World” 将通过标准输出设备屏幕完整重现出来[^3]。 --- ### 数组名等于数组首地址的解释 在C语言中,数组名本质上是一个常量指针,代表整个数组的第一个元素的位置或者说基址(base address)。因此当我们提到 “数组名等于数组首地址”,实际上是说当你仅提供数组名称而不加任何索引下标时,默认返回的就是这个一维线性排列结构内部首个成员所在物理存储单元的实际入口坐标[^4]。 举个例子来说吧, ```c char myArray[5]; // ... printf("Address via name: %p\n", (void *)&myArray); printf("First element's addr:%p\n",(void*)&myArray[0]); ``` 这两条语句应该会产生完全相同的输出结果因为两者都指向同一片连续分配好的区块起点——也就是所谓的“首地址”。 需要注意的一点是虽然我们可以像这样自由地比较它们之间是否存在差异但我们绝对不应该试图修改所谓‘数组名字’本身毕竟那只是一个固定不变的概念而已并非真正的可变对象! --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值