题:求p[0]--p[5]的值(小端)
#include <stdio.h>
int main(void)
{
char* data = "12345678";
short* tmp = NULL;
char p[6] = {0};
tmp = (short *)&p[2];
*tmp = atoi(&data[4]); //"5678"==>5678===>0x162e
//p[0] = ?, p[1] = ?, p[2] = ?,
//p[3] = ?, p[4] = ?, p[5] = ?。
//结果用16进制表示
// 0x0,0x0,0x2e,0x16,0x0,0x0
return 0;
}
atoi
(ASCII to Integer)函数是 C 语言标准库中原型int atoi(const char* str);的一个函数,用于将字符串转换为对应的整数值,遇到“\n”符号结束转换,也就是将字符串“5678”转换为对应的整数值5678,其十六进制是0x162e;
&data[4]
取得字符串中索引为 4 的字符'5'
的地址,即字符串"5678"
的起始地址。- 每个字符串的结尾都隐含一个结尾符号“\n”。
- 题外话:数组和字符串的传参往往是“首地址”代表整体。
要注意指针有一个特点,与普通赋值等号右边不修改的特性不同,对等号右边的指针操作会同时修改相关联(等号左边)的指针变量,也就是 tmp = (short *)&p[2]; 中,对指针操作会影响数组P的值。
tmp = (short *)&p[2]; //short类型的tmp指向 p[2]
的地址;-------地址操作
*tmp = atoi(&data[4]); //将整数 5678
(0x162e)存储在 tmp
指针指向的地址;-------存储值操作
根据小端字节序(Little Endian),内存中低地址存储低位字节,高地址存储高位字节。
数组元素地址从低到高排序,十六进制中0x162e,0x2e才是低字节,
所以p[2] =0x2e; p[3] =0x16;