C编程为什么字符数组的地址从0012FF74增加到0012FF75?
代码如下:C编程为什么字符数组的地址从0012FF74增加到0012FF75?,c,C,代码如下: char chararray[] = {68, 97, 114, 105, 110}; /* 1 byte each*/ int i; printf("chararray intarray\n"); printf("-------------------\n"); for(i = 0; i < 5; i++) printf("%p\n", (chararray + i)); 现在我试图用十六进制、位和字节来理解这一点
char chararray[] = {68, 97, 114, 105, 110};
/* 1 byte each*/
int i;
printf("chararray intarray\n");
printf("-------------------\n");
for(i = 0; i < 5; i++)
printf("%p\n", (chararray + i));
现在我试图用十六进制、位和字节来理解这一点
我知道一个字符是1字节,它应该增加1字节,即8位
但我不明白它怎么会以十六进制增加1?1十六进制仅表示4位正确吗?所以我有点困惑,它似乎只增加了4位
非常感谢您对清理此问题的任何帮助 如果用十六进制表示一个字节,那么它是由两个十六进制数字组成的,其中每个数字代表4位。
但是,您看到的地址是字节的地址,而不是字节的内容。每个字节接收自己的地址,地址是顺序的,就像我们给每个字节一个数字一样:字节0、字节1、字节2、字节3等等。使用十六进制数字只是表示任何数字的另一种方式。它与位和字节无关。一个字节是8位,不管你是用十六进制数还是十进制数来表示。所以它只是增加1=1字节=8位。指针中的地址指向一个字节,而不是一个位。指针的类型为
char*
,因此当它递增时,地址会增加sizeof(char)
。但是,如果使用了不同的类型,例如int
,指针在每次增量上都会增加sizeof(int)
,即使指针指向char[]
数组
例如,在我的机器上,sizeof(int)==4
我写了这段代码:
#include <stdio.h>
int main()
{
char str[] = "ACBDEFGHIJKLMNOPQRSTUVWXYZ";
int *a = str;
printf("Char\tAddr\n");
while(a <= &str[25])
{
printf("%c\t%p\n", *a, (void *)a);
a++;
}
return 0;
}
字符串中每四个字符输出一次。首先,指针算术,如
(chararray+i)
,其中chararray
指向char
(即类型为char*
)将指针chararray
的值增加i*sizeof(char)
。请注意,根据定义,sizeof(char)
是1
其次,指针表示内存地址,该地址由一个整数值表示,该整数值指示(绝对或相对)寻址内存块中的位置,例如堆上、堆栈上、某些其他数据段上等等。例如,在本节中授予以下声明:
6.3.2.3指针
(5) 整数可以转换为任何指针类型
(6) 任何指针类型都可以转换为整数类型
因此,当查看指针的值时,我们可以想到一个整数值,就像256
或1024
(以十进制格式查看)或0x100
或0x400
(以十六进制格式查看)一样。请注意,十进位中的256
相当于十六进制中的100
,这与位和字节无关
将1
与256
(或0x100)的整数值相加得到257
(或0x101),无论该值代表内存块中的某个位置还是百货商店中出售的橙子。所以这一切都是关于以十六进制格式“输出”整数值
请参阅下面的代码来说明这一点:
int main()
{
char chararray[] = {68, 97, 114, 105, 110};
for(int i = 0; i < 5; i++) {
char *ptr = (chararray + i);
unsigned long ptrAsIntegralVal = (unsigned long)ptr;
printf("ptr: %p; in decmial format: %lu\n", ptr, ptrAsIntegralVal);
}
}
在十六进制中,该值由第i位的和乘以16^(i-1)得到。因此,第一位(从右开始)添加值1,而不是16。注意:为了避免未定义的行为,与
%p
一起使用的参数类型必须是ptr to void:printf(“%p\n”,(void*)(chararray+i))代码>十六进制只是一种写数字的方式。。。如果你把一个数字增加1,那么它在十六进制、十进制、八进制或任何形式下都会增加1。
Char Addr
A 00D5F9BC
E 00D5F9C0
I 00D5F9C4
M 00D5F9C8
Q 00D5F9CC
U 00D5F9D0
Y 00D5F9D4
int main()
{
char chararray[] = {68, 97, 114, 105, 110};
for(int i = 0; i < 5; i++) {
char *ptr = (chararray + i);
unsigned long ptrAsIntegralVal = (unsigned long)ptr;
printf("ptr: %p; in decmial format: %lu\n", ptr, ptrAsIntegralVal);
}
}
ptr: 0x7fff5fbff767; in decmial format: 140734799804263
ptr: 0x7fff5fbff768; in decmial format: 140734799804264
ptr: 0x7fff5fbff769; in decmial format: 140734799804265
ptr: 0x7fff5fbff76a; in decmial format: 140734799804266
ptr: 0x7fff5fbff76b; in decmial format: 140734799804267