C语言指针内存?

时间:2016-10-12 14:53:56

标签: c memory heap-memory

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个元素(即3)。我不知道下一行是什么* p =(int)* c;手段。任何人都可以解释一下这行代码吗?

编辑: 在p增加之后,任何人都可以解释它将指向什么?

3 个答案:

答案 0 :(得分:0)

*p = (int) *c;

*c表示您获取地址c

的值

(int)将其转换为int

*p=写入地址p指向

因此,如果您修复droppy所说的内容,c[0]

的第3部分中会有array的数值

所以它会是1,2,65,4,5

答案 1 :(得分:0)

  1. 你应该使用'p =& array [3];'。然后指针指向数组的第三个元素,即'C'

  2. *p = (int) *c;

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

答案 2 :(得分:0)

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

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

根据您的要求,有两种方法可以解决此问题。如果你想将p设置为指向array[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;

说“获取char指向的c对象的值,将其转换为int 1 ,并将结果分配给p指向的对象。“

除非它是sizeof或一元&运算符的操作数,或者是用于在声明中初始化char数组的字符串文字,类型为“{-1}}的N元素数组”的表达式将被转换(“衰减”)为“指向T的指针”类型的表达式,表达式的值将为数组的第一个元素的地址。

表达式 T的类型为“{-1}}的5元素数组”。由于它不是c或一元char运算符的操作数,因此它将转换为类型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];

<小时/>

  1. array[3] = (int) 'A'; 演员表达;这意味着它后面的值应该被视为类型array[3] = 65;