C++入门——60s从0到1
指针关系
指针是C++中一个强大而灵活的特性,它允许程序直接访问和修改变量的内存地址和值。本文将详细介绍C++中的指针,包括指针的概念、指针的定义和使用、指针运算、指针和数组的关系、指针和函数的关系等。
指针的概念
指针是一个变量,它存储了一个内存地址。通过指针,我们可以直接访问该地址上存储的值,或者修改该地址上存储的值。
在C++中,一个变量的地址可以通过使用&运算符获得,例如:
int x = 10;
int* ptr = &x; // ptr存储了x的地址
在上面的例子中,`ptr`是一个指向整数类型的指针,它存储了`x`变量的地址。我们可以使用*运算符来访问该地址上存储的值,例如:
int y = *ptr; // y的值为10
在上面的例子中,`*ptr`表示该地址上存储的值,即`x`的值。
指针的定义和使用
在C++中,可以使用`int*`这样的语法来定义一个指向整数类型的指针。例如:
int* ptr; // 定义一个指向整数类型的指针
在上面的例子中,我们定义了一个名为`ptr`的指针,它可以指向任何整数类型的变量。要使一个指针指向某个变量,可以使用`&`运算符,例如:
int x = 10;
ptr = &x; // 将ptr指向x变量
在上面的例子中,我们将`ptr`指向了`x`变量。现在,我们可以使用`*ptr`来访问`x`变量的值。
除了指向基本数据类型的指针外,还可以定义指向结构体、数组、函数等类型的指针。
指针运算
指针可以进行加、减、比较等运算。这些运算通常是基于指针所指向的类型进行的。例如,两个指向整数类型变量的指针可以进行加法运算,结果是指向下一个整数类型变量的指针。
指针还可以进行取模运算,用于计算两个指针之间的距离(以元素个数为单位)。例如:
int arr[] = {1, 2, 3, 4, 5};
int* ptr1 = &arr[0]; // ptr1指向arr[0]
int* ptr2 = &arr[3]; // ptr2指向arr[3]
int dist = (ptr2 - ptr1) / sizeof(int); // dist的值为3
在上面的例子中,我们计算了`ptr2`和`ptr1`之间的距离(以元素个数为单位),结果为3。这是因为它们之间有3个整数类型的元素(即arr[0]、arr[1]、arr[2])。
指针和数组的关系
在C++中,数组名实际上是一个指向该数组第一个元素的常量指针。因此,我们可以使用数组名来进行一些特殊的指针运算。例如:
int arr[] = {1, 2, 3, 4, 5}; int* ptr = arr; // 等价于int* ptr = &arr[0] // 使用指针遍历数组并输出每个元素的值 for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) { cout << *(ptr + i) << " "; // 等价于cout << arr[i] << " " }
在上面的例子中,我们使用了数组名来初始化一个指向整数的指针。然后使用循环遍历了整个数组并输出了每个元素的值。注意,在使用指针遍历数组时要注意不要超出数组的范围。
指针和函数的关系
在C++中,函数可以接受指针作为参数或返回一个指针作为结果。通过这种方式,函数可以直接修改变量的内存地址和值或返回一个新的内存地址给调用者。下面是一个简单的示例:
void swap(int* a, int* b) { // 一个交换两个整数的函数 int temp = *a; // 将a中的值存储到临时变量temp中 *a = *b; // 将b中的值赋给a中的变量 *b = temp; // 将temp中的值赋给b中的变量 } // 使用swap函数交换两个变量的值 int x = 10, y = 20; swap(&x, &y); // 将x和y的地址作为参数传递给swap函数