2014-02-28 45 views
0

我有一个指向字符的可变字。但是每当我试图增加& C,我得到了针对c离奇值:递增地址

char *word = "testing"; 
char c = *word; // 't' 
c = *(&c + 1); // want to be 'e' 

难道我做错了什么?

+0

因为c不是指针。 – OldProgrammer

+0

&c是一个指针,但它不指向与字 – Wajahat

+1

'相同的t',并且'c'是“变量c的地址”。所以如果将'c'存储在内存地址57中,则'c'的新值将是58.它不会是字符串'测试'的地址。 –

回答

4

线

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' 
2

c地址是某处在堆栈中。它与word指向的地址不同。要做到这一点:

char *word = "testing"; 
char *c = word; //same as &word[0] 
*c; //'t' 
c += 1; 
*c; //'e' 
1

c是一个char对象,其值是't'

&c + 1是一个有效的地址,正好在c的位置在内存中,但没有任何对象。 (仅在特殊情况下才允许指针指向数组的末尾,其中一个对象被视为1个元素的数组时才有效。)解除引用该地址会导致未定义的行为;在实践中,它可能会在内存中获取c之后发生的任何垃圾。

通过初始化c*word,你并没有c指向字符串的第一个字符,你做它包含字符串的第一个字符的副本