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