我有一个指向字符的可变字。但是每当我试图增加& C,我得到了针对c离奇值:递增地址
char *word = "testing";
char c = *word; // 't'
c = *(&c + 1); // want to be 'e'
难道我做错了什么?
我有一个指向字符的可变字。但是每当我试图增加& C,我得到了针对c离奇值:递增地址
char *word = "testing";
char c = *word; // 't'
c = *(&c + 1); // want to be 'e'
难道我做错了什么?
线
char c = *word; // 't'
堆栈一个新字符(c
)上分配内存空间。然后它将这个字符设置为't'
,因为那是*word
。 c(&c
)的地址不会与word
相同。
做你想做什么:
char c; //allocate space for a char
char *word = "testing";
c = *word; // c == 't'
c = *(word + 1); // c == 'e'
的c
地址是某处在堆栈中。它与word
指向的地址不同。要做到这一点:
char *word = "testing";
char *c = word; //same as &word[0]
*c; //'t'
c += 1;
*c; //'e'
c
是一个char
对象,其值是't'
。
&c + 1
是一个有效的地址,正好在c
的位置在内存中,但没有任何对象。 (仅在特殊情况下才允许指针指向数组的末尾,其中一个对象被视为1个元素的数组时才有效。)解除引用该地址会导致未定义的行为;在实践中,它可能会在内存中获取c
之后发生的任何垃圾。
通过初始化c
到*word
,你并没有c
指向字符串的第一个字符,你做它包含字符串的第一个字符的副本。
因为c不是指针。 – OldProgrammer
&c是一个指针,但它不指向与字 – Wajahat
'相同的t',并且'c'是“变量c的地址”。所以如果将'c'存储在内存地址57中,则'c'的新值将是58.它不会是字符串'测试'的地址。 –