如果机器是32位小端,而sizeof(int)是4字节。
鉴于以下计划:
line1: #include<stdio.h>
line2: {
line3: int arr[3]={2,3,4};
line4: char *p;
line5: p=(char*)arr;
line6: printf("%d",*p);
line7: p=p+1;
line8: printf("%d\n",*p);
line9: return 0;
}
预期产量是多少?
A
:2 3
B
:2 0
C
:1 0
D
:垃圾值
有一件事困扰我将整数指针转换为字符指针。
铸件有多重要?
编译器在第5行做什么? (p = (char *) arr;
)
第7行发生了什么? (p = p + 1
)
如果输出为20
,那么0
的打印方式如何?
答案 0 :(得分:1)
(D)
或特定于编译器,因为sizeof(int)
(以及字节序)依赖于平台。铸件有多重要?
Casting,作为一个整体是C语言中不可或缺的一部分(双关语)。
以及编号在第5行中会做什么?
它取arr
的第一个元素的地址并将其放入p
。
并且在第5行之后第7行?
它递增指针,使其指向该内存地址的下一个char
。
如果输出是2 0那么编译器如何打印0?
这是濒危和sizeof(int)
的组合。如果没有机器的规格,我无法解释其他任何事情。
但是,假设小端和sizeof(int) == 4
,我们可以看到以下内容:
// lets mark these memory regions: |A|B|C|D|
int i = 2; // represented as 0x02000000
char *ptr = (char *) &i; // now ptr points to 0x02 (A)
printf("%d\n", *ptr); // prints '2', because ptr points to 0x02 (A)
ptr++; // increment ptr, ptr now points to 0x00 (B)
printf("%d\n", *ptr); // prints '0', because ptr points to 0x00 (B)
答案 1 :(得分:1)
(E)以上都不是
但是,如果(a)您使用的是小端机器(例如x86)和(b)sizeof(int) >= 2
,则应打印“20”(两者之间不打印空格)。 / p>
a)每次一个字节读取数组而不是一系列int
s
b)这只是将第一个int
的地址强制转换为指向char
c)将p
中存储的地址增加sizeof(char)
(即1)
d){8}打印机int
的机器表示的第二个字节
答案 2 :(得分:0)
1.铸造的重要性: - char * p; 这一行声明了一个指向一个字符的指针。这意味着它的属性是它可以取消引用 一次只有一个字节,并且位移也是一个字节。
P =(字符*)ARR; 2.类型转换为char *仅用于避免编译器发出警告。 如果你不这样做也会有同样的行为。
作为我已在上面写的字符指针p = p + 1指向下一个字节
的printf( “%d \ n”,* P); %d将值格式化为十进制整数,以显示十进制格式 这里* p使用,并且根据其属性,它只能引用一个字节。所以现在内存组织进入了画面。 那就是你的机器遵循小端/ LSB优先或大端/ MSB优先
根据你的机器你的机器遵循小端。所以第一次你的ans是0。 然后下一个字节必须为零,因此输出为0。 在二进制: 2表示为00-00-00-02(字节表示) 但在内存中它存储如下 02-00-00-00这样的四个字节
在第一个内存字节02中 在第二个存储器字节00