c/c++指针中 * 和 & 的区别和联系
在C语言中,天天私服魔域*和&是两个非常基础但功能相反的操作符,它们分别是解引用(dereference)操作符和取地址(address-of)操作符。
&(取地址操作符)用途:&操作符用来获取变量的内存地址。
示例:假设有一个整型变量int x = 10;,则&x表示获取变量x的内存地址。如果你有一个指针变量想要存储变量x的地址,可以这样做:int *px = &x;。
*(解引用操作符)用途:*操作符用来访问指针指向的内存地址中存储的值,即获取该地址上的数据。
示例:继续上面的例子,现在px是一个指针,指向x的地址,*px就用来获取px指向的地址上存储的值,即x的值10。如果你想通过指针改变x的值,可以这样做:*px = 20;,这样x的值就变成了20。
关系和区别关系:&和*是相互补充的。&用于获取变量的地址,而*用于通过地址访问或修改该地址处的数据。
区别:&操作符作用于变量时,得到该变量的地址;*操作符作用于指针时,得到指针所指向的值。
使用场景&常用于初始化指针,使指针指向某个变量的地址。
*被用于通过指针间接访问和修改其指向地址的值。
理解这两个操作符的区别和联系对于深入理解C语言中的指针概念至关重要。
当然可以,让我们通过一些具体的例子来深入理解*和&操作符在C/C++中的应用。
示例1:基本使用#include <stdio.h> int main() { int var = 30; // 声明一个整型变量var int *ptr; // 声明一个指向整型的指针ptr ptr = &var; // 将var的地址赋给ptr printf("var的值: %d\n", var); // 输出var的值 printf("var的地址: %p\n", &var); // 输出var的地址 printf("ptr存储的地址: %p\n", ptr); // 输出ptr存储的地址(即var的地址) printf("ptr指向的值: %d\n", *ptr); // 通过解引用ptr,输出ptr指向地址上的值(即var的值) return 0; }
这个例子展示了如何使用&获取变量的地址,并将其赋给一个指针,然后通过*来解引用该指针,访问指针指向的数据。
示例2:通过指针修改数据#include <stdio.h> int main() { int value = 10; int *ptr = &value; // ptr指向value的地址 printf("Before: value = %d\n", value); // 修改前,输出value的值 *ptr = 20; // 通过解引用ptr,改变ptr指向地址上的数据 printf("After: value = %d\n", value); // 修改后,输出value的值 return 0; }
在这个例子中,我们通过指针间接修改了变量value的值。这说明了指针的强大功能,即通过指针我们可以在程序的任何地方访问和修改存储在特定内存地址上的数据。
示例3:使用指针与数组#include <stdio.h> int main() { int arr[3] = {10, 20, 30}; int *ptr = arr; // 数组名arr代表数组的起始地址 for (int i = 0; i < 3; i++) { printf("arr[%d]的地址: %p, 值: %d\n", i, ptr, *ptr); ptr++; // 移动指针到下一个整型元素的地址 } return 0; }
这个例子演示了如何使用指针遍历数组。注意,数组名本身就是指向数组首元素的指针,因此可以直接将数组名赋值给指针变量。通过递增指针,我们可以依次访问数组中的每个元素。
以上示例展示了&和*操作符的基本用法及其在实际编程中的应用。理解并掌握这些概念对于进行更复杂的指针操作和内存管理是非常重要的。