C将代码放入一个班轮中

时间:2014-01-16 21:45:36

标签: c

我正在学习C,这可能是有史以来最愚蠢的问题,但现在就去了!

我的代码:

char tmp = *x++;
char *g = &tmp;

我可以在单行中执行此行代码吗?有类似的东西:

char *g = &(*x++);

更多信息:

char *x = "1234";
//Turn each 'number' to a int
while(*x != '\0'){
    char tmp = *x++;
    char *x = &tmp;
    int t = atoi(x);
}

2 个答案:

答案 0 :(得分:5)

如果x是指向char的指针(并指向现有对象),则标准C中允许声明char *g = &(*x++);并且已定义行为。

根据C 2011 6.5.3.2 4,*运算符的结果是左值,因此其地址可以与&一起使用。

详细说明:

  • x++会增加x并生成x的原始值。 (注意:递增指针需要指针指向一个对象。它不需要它是一个数组元素,或者它后面还有另一个对象;只要你有一个对象就可以增加到一点然后不要取消引用指向不存在的对象的指针。)
  • *x++取消引用指针(x的原始值)。结果是左值。
  • &(*x++)获取左值的地址,这是x的原始值。
  • 然后,此值用于初始化g

此外,C 2011 6.5.3.2 3指定&*的组合取消,但结果不是左值并且通常的约束适用,因此&并且实际上并未评估*个操作。因此,此语句与char *g = x++;相同。

答案 1 :(得分:1)

就像一个提示:你是否意识到你正在遮蔽外部的x变量?

您目前正在做的是:

char *x = "1234"; //declare c style string
while(*x != '\0'){ //for the conditional the "outer" x will be used for comparsion
    char tmp = *x++; //increment x to point to whatever comes sizint atoi (const char * str);eof(char) bytes afterwards; dereference what x previously pointed to (postfix ++) and save it in local char tmp
    char *x = &tmp; //take adress of the local char and save its adress in a new local/inner char*
    int t = atoi(x); //call atoi on the inner x

虽然这可能会起作用,但这样的阴影变量可能会造成混淆。 (特别是对其他开发者感到困惑)

另请看一下atoi的签名:

int atoi (const char * str);

在这里你可以看到你可以像这样安全地传递指针:

int t = atoi(&x);
++x; 

或者最好:

int t = atoi(&x++);