【问题标题】:C Language Pointer Memory?C语言指针内存?
【发布时间】:2016-10-12 14:53:55
【问题描述】:
int num = 78;
int *p;

int array[SIZE] = {0,1,2,3,4};
char c[SIZE] = {'A', 'B', 'C', 'D', 'E'};

p = array[3];
*p = (int) *c;
p++;
array[4] = num;
p++;
p = c;
p++;

我正在尝试找出上述代码背后的内存。我知道指针 p 最初指向数组的第三个元素(即 3)。我不知道下一行 *p = (int) *c;方法。谁能解释一下那行代码??

编辑: 在 p 这样递增之后,任何人都可以解释它指向什么吗?

【问题讨论】:

  • 那会崩溃。你想要p = &array[3];p = array + 3;
  • Find a good beginners book 并阅读有关数组和指针的章节。
  • “我知道指针 p 最初指向数组的第三个元素”。不,您尝试为p 赋值是无效的。

标签: c memory heap-memory


【解决方案1】:
  1. 您应该使用“p = &array[3];”。然后指针将指向数组的第三个元素,即'C'

  2. *p = (int) *c;

c[size] 是一个数组。 c 是数组的基指针。所以*c 是基指针'A' 的值。该语句会将'A' 放在数组的第三个元素中。所以数组现在包含A, B, A, D, E

【讨论】:

    【解决方案2】:
    p = array[3]; // int * = int
    

    是一个错误;类型不匹配,编译器会为此大喊大叫。 p 的类型为int *array[3] 的类型为int

    有两种方法可以解决此问题,具体取决于您要执行的操作。如果你想将 p 设置为 pointarray[3](在这种情况下你想要这样做),你会写

    p = &array[3]; // int * = int *
    

    如果你想将array[3]写入p指向的对象(这不是在这种情况下你想要做的,因为p 还没有指向任何有效的地方),你会写

    *p = array[3]; // int = int
    

    在这种情况下,我们要设置p 指向array[3],所以我们使用第一条语句。这样做之后,以下是正确的:

     p == &array[3]          // int *
    *p ==  array[3] == 2     // int
    

    现在我们有了声明

    *p = (int) *c;
    

    是说“取c指向的char对象的值,将其转换为int1,并将结果分配给p的对象指着。”

    除非它是sizeof 或一元& 运算符的操作数,或者是用于在声明中初始化char 数组的字符串文字,表达式 type "N-element array of T" 将被转换("decay")为 "pointer to T" 类型的表达式,表达式的值将是数组第一个元素的地址。

    表达式 c 的类型为“char 的 5 元素数组”。由于它不是sizeof或一元&运算符的操作数,因此将其转换为char *类型的表达式,表达式的值是数组中第一个元素的地址c[0] .因此:

     c == &c[0]                         // char *
    *c ==  c[0] == 'A' == 65 (ASCII)    // char
    

    将所有这些放在一起,这意味着

    *p = (int) *c;
    

    是另一种写法

    *p = (int) c[0];
    

    这是另一种写法

    array[3] = (int) c[0];
    

    这是另一种写法

    array[3] = (int) 'A';
    

    这是另一种写法

    array[3] = 65;
    


    1. (int) 是一个转换表达式;这意味着它后面的值应该被视为类型int

    【讨论】:

      【解决方案3】:

      *p = (int) *c;

      *c表示你取c地址处的值

      (int) 将其转换为 int

      *p= 写入地址p 指向

      所以如果你修复了droppy所说的,array的第三部分会有c[0]的数值

      所以应该是1,2,65,4,5

      【讨论】:

      • "p的地址"是&p。您的意思是“到地址p 指向”。这是在任何教程中都能找到的基本内容。强制转换是有问题的,适当增强的编译器实际上应该警告该分配。注意:始终使用降价。
      • @Olaf 对不起,这就是我的意思...只是表述错误
      猜你喜欢
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多