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