Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
另一个C指针问题_C_Pointers - Fatal编程技术网

另一个C指针问题

另一个C指针问题,c,pointers,C,Pointers,我以为我真的开始理解指针是如何工作的,然后我遇到了这个练习。我试图重新创建我在“学习C”一书中找到的一段代码,我完成了它,它工作正常,我觉得一切都很好: void PrintWords( char *line ) { bool inWord = false; while (*line != kByteZero) { if (! isspace(*line)) { if (inWord == false) {

我以为我真的开始理解指针是如何工作的,然后我遇到了这个练习。我试图重新创建我在“学习C”一书中找到的一段代码,我完成了它,它工作正常,我觉得一切都很好:

void PrintWords( char *line ) {

    bool inWord = false;

    while (*line != kByteZero) {

        if (! isspace(*line)) {

            if (inWord == false) {
                putchar('\n');
                inWord = true;

            }
            putchar(*line);
        } else {
            inWord = false; 
        }
        *line++;
    }
}
它只是一个简单的函数,可以在单独的行上显示数组中的单词。当我将它与书中的代码进行比较时,我发现了一个明显的区别。书中代码的最后一行是“line++”,而不是“*line++”


我认为使用“line++”与我们在这里尝试的完全相反。我试图增加指针指向的位置,并操作存储在该内存地址的文件。”line++“对我来说似乎很奇怪,因为我甚至不知道它告诉代码做什么?从第[i]行移动到第[i+1]行??这看起来很奇怪,因为“line”本身似乎只是一个指针——如果是这样的话,为什么我不能用“line”替换*line的每个实例呢?

在这种情况下,
*line++
line++
是完全相同的。后缀
++
的优先级高于
*
。您可以将代码替换为:

*(line++)
这很容易看出是不必要的。你在这里展示的程序完全按照你所说的做——它想增加指针指向下一个字符,这样它就可以测试它并打印它或换行符。您希望
line
引用指针,而
*line
取消对指针的引用并获取指针所指向的内容


我刚刚用你的代码做了一个快速测试。我从gcc得到一个警告,“计算的值未被使用”,在这种情况下,
*line++
line++
是完全相同的。后缀
++
的优先级高于
*
。您可以将代码替换为:

*(line++)
这很容易看出是不必要的。你在这里展示的程序完全按照你所说的做——它想增加指针指向下一个字符,这样它就可以测试它并打印它或换行符。您希望
line
引用指针,而
*line
取消对指针的引用并获取指针所指向的内容


我刚刚用你的代码做了一个快速测试。我从gcc得到一个警告,“计算的值未使用”,其中
*

行是一个指针

在这种情况下将是一些数字,如0x80b34560

*行
类似于
'c'

因此,
包含一个内存位置的地址,该内存位置包含(比方说)
'c'

当您希望
指向下一个位置时,您可以说
行+
,它将是下一个数字(比如0x80b34561,它是一个包含
'd'
的内存位置)

这里的混淆源于
*line++
中的运算符优先级。这相当于
*(line++)
,因为
++
的优先级高于
*
。所以你要做的就是得到指针上存储的值,然后把它扔掉,这是没有用的

下面是一张图表:

+-------------------------------+
|  var     |  address |  value  |
+-------------------------------+
| line     | 80b34560 |  'a'    |
| (line+1) | 80b34561 |  'b'    |
| line[2]  | 80b34562 |  ' '    |
| etc...   |          |         |
+-------------------------------+

注意,我在访问地址时使用了两种不同的符号--
line+1
line[2]
。您的问题“从[i]行移到[i+1]行”是正确的,但请重新思考您的结论。

行是一个指针

在这种情况下将是一些数字,如0x80b34560

*行
类似于
'c'

因此,
包含一个内存位置的地址,该内存位置包含(比方说)
'c'

当您希望
指向下一个位置时,您可以说
行+
,它将是下一个数字(比如0x80b34561,它是一个包含
'd'
的内存位置)

这里的混淆源于
*line++
中的运算符优先级。这相当于
*(line++)
,因为
++
的优先级高于
*
。所以你要做的就是得到指针上存储的值,然后把它扔掉,这是没有用的

下面是一张图表:

+-------------------------------+
|  var     |  address |  value  |
+-------------------------------+
| line     | 80b34560 |  'a'    |
| (line+1) | 80b34561 |  'b'    |
| line[2]  | 80b34562 |  ' '    |
| etc...   |          |         |
+-------------------------------+

注意,我在访问地址时使用了两种不同的符号--
line+1
line[2]
。您的问题“从[i]行移到[i+1]行”是正确的,但请重新思考您的结论。

表达式
line++
增加了指针,这就是您试图做的

表达式
*line++
递增指针,并返回新地址处的字符值。但是,您并没有使用该值执行任何操作


后缀运算符
++
的优先级高于
*
运算符。

表达式
行+++
增加指针,这就是您尝试执行的操作

表达式
*line++
递增指针,并返回新地址处的字符值。但是,您并没有使用该值执行任何操作


后缀运算符
++
的优先级高于
*
运算符。

是指针<代码>行+++
将增加指针,即将其移动到下一个字符。正如您自己正确说明的那样,它将指针从
行[i]
移动到
行[i+1]
(在传递到
打印字
函数的
的原始值中)

我完全无法理解“操纵存储在该内存地址的文件”的含义。你在说什么“文件”

我也不清楚你的“用‘line’替换*line的每个实例”的含义。当我们想使用指针
时,我们使用
。我们使用<代码