Skip to content

L4_01 指针

一、指针类型

1.1 定义

指针是一个变量,存储的是另一个变量的内存地址。

1.2 声明

cpp
// 声明一个指向 int 类型的指针
int *ptr;

// 声明多个指针
int *p1, *p2;

// 指向常量的指针
const int *ptr;

// 指针常量
int *const ptr;

1.3 指针的大小

cpp
#include <iostream>
using namespace std;

int main() {
    int *p;
    double *q;
    char *r;
    
    cout << "int指针大小: " << sizeof(p) << endl;
    cout << "double指针大小: " << sizeof(q) << endl;
    cout << "char指针大小: " << sizeof(r) << endl;
    
    return 0;
}

二、指针类型定义变量

2.1 基本语法

cpp
int value = 10;
int *ptr = &value;  // ptr指向value的地址

2.2 示例

cpp
#include <iostream>
using namespace std;

int main() {
    int num = 42;
    int *ptr = &num;
    
    cout << "变量的值: " << num << endl;
    cout << "变量的地址: " << &num << endl;
    cout << "指针的值(地址): " << ptr << endl;
    
    return 0;
}

三、指针变量的赋值

3.1 基本赋值

cpp
int a = 10;
int *p = &a;  // 指针指向变量a

3.2 指针之间赋值

cpp
int *p1 = &a;
int *p2 = p1;  // p2也指向a的地址

3.3 空指针

cpp
int *ptr = nullptr;  // C++11标准
int *ptr = NULL;     // 传统方式

四、解引用

4.1 概念

通过指针访问它指向的变量的值。

4.2 语法

cpp
*指针变量

4.3 示例

cpp
#include <iostream>
using namespace std;

int main() {
    int num = 100;
    int *ptr = &num;
    
    cout << "num的值: " << num << endl;
    cout << "*ptr的值: " << *ptr << endl;
    
    *ptr = 200;  // 通过指针修改变量的值
    cout << "修改后num的值: " << num << endl;
    
    return 0;
}

五、指针运算

5.1 指针加减

cpp
int arr[] = {1, 2, 3, 4, 5};
int *p = arr;  // 指向第一个元素

cout << *p << endl;   // 输出1
cout << *(p+1) << endl; // 输出2
cout << *(p+2) << endl; // 输出3

5.2 指针比较

cpp
int arr[5];
int *p1 = arr;
int *p2 = arr + 3;

if (p1 < p2) {
    cout << "p1在p2前面" << endl;
}

六、指针与数组

6.1 数组名与指针

cpp
int arr[] = {10, 20, 30};
int *p = arr;  // 数组名是第一个元素的地址

cout << *arr << endl;   // 输出10
cout << *p << endl;     // 输出10

6.2 遍历数组

cpp
int arr[] = {1, 2, 3, 4, 5};
int *p = arr;

for (int i = 0; i < 5; i++) {
    cout << *(p + i) << " ";
}

七、指针与函数

7.1 指针作为函数参数

cpp
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 5, y = 10;
    swap(&x, &y);
    cout << "x=" << x << ", y=" << y << endl;
    return 0;
}

7.2 返回指针的函数

cpp
int* createArray(int size) {
    int *arr = new int[size];
    for (int i = 0; i < size; i++) {
        arr[i] = i;
    }
    return arr;
}

八、示例程序

cpp
#include <iostream>
using namespace std;

int main() {
    int value = 42;
    int *ptr = &value;
    
    cout << "变量 value:" << endl;
    cout << "  值: " << value << endl;
    cout << "  地址: " << &value << endl;
    
    cout << "\n指针 ptr:" << endl;
    cout << "  值(指向的地址): " << ptr << endl;
    cout << "  解引用(*ptr): " << *ptr << endl;
    cout << "  指针自身的地址: " << &ptr << endl;
    
    // 修改指针指向的值
    *ptr = 100;
    cout << "\n修改后:" << endl;
    cout << "  value = " << value << endl;
    cout << "  *ptr = " << *ptr << endl;
    
    return 0;
}

百炼成钢,融会贯通