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增加之后,任何人都可以解释它将指向什么?
答案 0 :(得分:0)
*p = (int) *c;
*c
表示您获取地址c
(int)
将其转换为int
*p=
写入地址p
指向
因此,如果您修复droppy所说的内容,c[0]
array
的数值
所以它会是1,2,65,4,5
答案 1 :(得分:0)
你应该使用'p =& array [3];'。然后指针指向数组的第三个元素,即'C'
*p = (int) *c;
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];
<小时/>
array[3] = (int) 'A';
是演员表达;这意味着它后面的值应该被视为类型array[3] = 65;
。