以下哪项是下面给出的程序的正确输出?

时间:2012-07-25 15:22:31

标签: c pointers

如果机器是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:垃圾值

有一件事困扰我将整数指针转换为字符指针。

  1. 铸件有多重要?

  2. 编译器在第5行做什么? (p = (char *) arr;

  3. 第7行发生了什么? (p = p + 1

  4. 如果输出为20,那么0的打印方式如何?

3 个答案:

答案 0 :(得分:1)

  1. (D)或特定于编译器,因为sizeof(int)(以及字节序)依赖于平台。
  2.   

    铸件有多重要?

    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 *仅用于避免编译器发出警告。    如果你不这样做也会有同样的行为。

  1. 作为我已在上面写的字符指针p = p + 1指向下一个字节

  2. 的printf( “%d \ n”,* P); %d将值格式化为十进制整数,以显示十进制格式 这里* p使用,并且根据其属性,它只能引用一个字节。所以现在内存组织进入了画面。 那就是你的机器遵循小端/ LSB优先或大端/ MSB优先

    根据你的机器你的机器遵循小端。所以第一次你的ans是0。 然后下一个字节必须为零,因此输出为0。 在二进制: 2表示为00-00-00-02(字节表示) 但在内存中它存储如下 02-00-00-00这样的四个字节

    在第一个内存字节02中 在第二个存储器字节00