Linux C 编程教程第 20 部分 - 指针地址运算
在此页
- C 中的指针地址运算
- 结论
在这个正在进行的 C 编程系列的上一个教程中,我们详细讨论了指针。扩展该讨论,这里我们有一些与指针相关的更多值得讨论的概念。因此,事不宜迟,让我们开始吧。
C中的指针地址运算
首先,让我们在处理指针时关注地址算法。就像我们在之前的教程中讨论的那样,如果您有一个指向数组的指针(比如说它的开头),那么访问该数组的元素就非常容易。这是一个例子:
#include <stdio.h>
int main()
{
char arr[]={'a','b','c','d'};
int a[]={1,2,3,4};
char *ptr = arr;
int *p = a;
for(int i=0; i<sizeof(arr); i++)
{
printf("\n Character pointer pointing to %u, with value %c", ptr, *ptr);
ptr++;
}
for(int i=0; i<(sizeof(a)/sizeof(int)); i++)
{
printf("\n Integer pointer pointing to %u, with value %d", p, *p);
p++;
}
return 0;
}
所以在这段代码中,我们有两个数组——arr 和 a。第一个是字符数组,第二个是整数数组。然后我们必须指向这些数组的指针 - 分别是 ptr 和 p。然后有几个 for 循环,其中我们打印指针指向的当前地址和该地址中包含的值。
这是我机器上这段代码的输出:
Character pointer pointing to 726409312, with value a
Character pointer pointing to 726409313, with value b
Character pointer pointing to 726409314, with value c
Character pointer pointing to 726409315, with value d
Integer pointer pointing to 726409296, with value 1
Integer pointer pointing to 726409300, with value 2
Integer pointer pointing to 726409304, with value 3
Integer pointer pointing to 726409308, with value 4
现在,这里值得注意的是输出中打印的地址。对于字符数组,向指针加 1 会使它递增到下一个地址,但是对于整数数组,向指针加 1 会使它向前跳转 4 个地址。为什么?
好吧,这完全取决于指针的类型。一个字符指针总是跳转一个字符占用的字节数,通常是1。同样,一个指向整数的指针通常在递增1时跳转4个字节。所以这应该解释了上面输出中字符和整数指针跳转的区别.
继续指针算法,指针可以用于选择情况下的比较表达式。例如,如果你想确认一个指针ptr是否指向一个数组arr(sized size)的元素,那么你可以通过以下方式进行比较:
if((ptr >= arr) && (ptr < (arr + size)))
如此有效,上面的表达式检查指针持有的地址是否属于它的元素之一。
此外,如果有多个指针指向同一个数组的元素,您可以使用以下比较运算符 ==、!=、< 和 >=。实际上,您也可以在这些情况下执行指针减法。这是一个例子:
#include <stdio.h>
int main()
{
char arr[]= "Welcome to HowtoForge";
char *ptr = arr;
char *p = arr;
while(*p != '\0')
{
p++;
}
printf("\n Length of the string is %d", (p - ptr));
return 0;
}
所以在这个程序中,我们确保一个指针指向数组的第一个元素,而第二个指针不断递增,直到它指向最后一个元素(在常量字符串中)。
然后,考虑到这里处理的是字符(每个字符占用一个字节),通过从第二个指针指向的地址中减去第一个指针指向的地址,我们可以找到字符数,如果你看到是准确的字符串的长度。
注意:请记住,对于指针,加法、乘法、除法等操作是无效的。此外,到目前为止我们列出的可接受的操作类型也仅在指针类型相同且指向同一数组的元素时才有效。
结论
在上一个教程中讨论了基本的指针概念之后,我们通过在此处讨论指针地址算法来构建指针概念。我们建议您以程序的形式在您的机器上练习我们在这里讨论的所有内容。如果您有任何疑问或疑问,请随时在下方发表评论。