一篇文章搞懂C语言指针(附应用及习题)

一,基本的解释 

C 语言中的指针是一个非常重要且强大的概念,它允许直接访问内存地址,并处理数据的引用和传递。以下是关于 C 语言指针的详细解释:

1. 指针的概念:
指针是一个变量,其值是另一个变量的内存地址。换句话说,指针存储了一个变量的位置信息。

2. 如何声明指针:
在 C 语言中,声明一个指针需要指定指针所指向变量的数据类型。例如,声明一个指向整数的指针:

int *ptr; // 声明一个指向整数的指针变量 ptr

这里的 `int *` 表示指向整数的指针类型。 

3. 获取变量的地址:
可以使用 `&` 运算符来获取变量的地址。例如:

int var = 10; // 定义一个整数变量 var
int *ptr = &var; // 将 var 的地址赋值给指针 ptr

这样,`ptr` 将包含变量 `var` 的地址。

接下来我们通过一个简单的图来说明:

     +---+     +-----+
num: | 10|     | ptr |        +-----+
     +---+     +-----+        |     |
    0x7FFC       0x7FF0  ---> | 0x7FFC |  (存储 num 变量的地址)
                                +-----+
  • num 存储一个整数值 10,其内存地址为 0x7FFC
  • ptr 是一个指向整数的指针。在这个例子中,它存储 num 的地址 0x7FFC

要访问 num 的值,可以通过指针 ptr 进行间接访问

4. 通过指针访问数据:
可以使用指针来访问存储在特定地址上的值。通过解引用操作符 `*` 来访问指针指向的变量的值。例如:

int value = *ptr; // 获取指针 ptr 指向的变量的值,存储在 value 中

5. 指针的算术运算:
指针可以进行算术运算,如指针加法、指针减法等。这对于在数组、字符串等数据结构中移动非常有用。

 6. 指针和数组:
在 C 语言中,数组名本身就是一个指向数组首元素的指针。因此,可以通过指针操作来处理数组元素。

7. 指针和函数:
指针也被广泛用于函数中,可以传递指针作为参数,以便在函数内部修改调用者的变量。

8. 指针的注意事项:
- 指针操作需要谨慎,因为错误的指针操作可能导致程序运行错误或内存泄漏等问题。
- 空指针(NULL 指针)是指不指向任何有效地址的指针,可以使用宏 `NULL` 或整数 `0` 来表示空指针。

二,基础应用 

1. 基本的指针操作:
 

#include <stdio.h>

int main() {
    int var = 25; // 定义一个整数变量 var
    int *ptr; // 声明一个指向整数的指针变量 ptr

    ptr = &var; // 将 var 的地址赋给指针 ptr

    printf("var 的值:%d\n", var); // 打印 var 的值
    printf("var 的地址:%p\n", &var); // 打印 var 的地址
    printf("ptr 指向的值:%d\n", *ptr); // 打印指针 ptr 指向的值(即 var 的值)

    return 0;
}

2. 指针和函数:

#include <stdio.h>

// 函数用于交换两个整数的值
void swap(int *x, int *y) {
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

int main() {
    int a = 10, b = 20;

    printf("交换前:a = %d, b = %d\n", a, b);

    swap(&a, &b); // 传递变量地址作为参数进行交换

    printf("交换后:a = %d, b = %d\n", a, b);

    return 0;
}


3. 指针和数组:
 

#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr = arr; // 指向数组首元素的指针

    for (int i = 0; i < 5; i++) {
        printf("arr[%d] = %d\n", i, *(ptr + i)); // 使用指针访问数组元素
    }

    return 0;
}

这些例子展示了指针的基本用法,包括指针的声明、指针和函数的使用、指针和数组的关系等。通过这些示例可以更好地理解和学习指针在 C 语言中的应用。

 三,高阶应用

动态内存分配
 

int *ptr;
ptr = (int *)malloc(sizeof(int)); // 为一个整数分配内存空间

if(ptr != NULL) {
    *ptr = 20; // 通过指针赋值
    printf("动态分配的内存值为:%d\n", *ptr); // 输出动态分配的内存值
    free(ptr); // 释放内存
} else {
    printf("内存分配失败\n");
}

数组和指针
 

int arr[] = {10, 20, 30, 40, 50};
int *ptr = arr; // 数组名即代表数组首元素的地址

for(int i = 0; i < 5; i++) {
    printf("数组元素 %d 的值为:%d\n", i+1, *ptr); // 输出数组元素的值
    ptr++; // 指针后移
}

函数与指针
 

void swap(int *x, int *y) {
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

int a = 10, b = 20;
printf("交换前:a=%d, b=%d\n", a, b);
swap(&a, &b); // 传递指针参数进行交换
printf("交换后:a=%d, b=%d\n", a, b);

字符串和指针

char *str = "Hello, World!";
printf("字符串内容为:%s\n", str); // 输出字符串内容

// 指针遍历输出字符串
while(*str != '\0') {
    printf("%c", *str);
    str++;
}

 结构体和指针
 

struct Point {
    int x;
    int y;
};

struct Point p1 = {10, 20};
struct Point *ptr = &p1; // 结构体指针指向结构体变量

printf("结构体成员值为:%d, %d\n", ptr->x, ptr->y); // 通过指针访问结构体成员

这些示例展示了指针在动态内存分配、数组、函数、字符串、结构体等不同场景中的应用。指针在C语言中是一个强大且灵活的工具,但也需要小心使用,因为不正确的指针操作可能会导致内存泄漏和程序错误。

四,常见用法

指针作为函数返回值

int* createIntArray(int size) {
    int *arr = (int *)malloc(size * sizeof(int));
    // 创建一个大小为 size 的整型数组,并返回指向它的指针
    return arr;
}


指针数组

int a = 10, b = 20, c = 30;
int *ptrArr[] = {&a, &b, &c}; // 指针数组存储整型指针

for(int i = 0; i < 3; i++) {
    printf("ptrArr[%d] 的值为:%d\n", i, *ptrArr[i]); // 输出指针数组元素的值
}


多级指针
 

int num = 10;
int *ptr1 = &num; // 指向整数的指针
int **ptr2 = &ptr1; // 指向指针的指针

printf("num 的值为:%d\n", **ptr2); // 输出通过多级指针访问 num 的值

 指向函数的指针
 

int add(int a, int b) {
    return a + b;
}

int (*ptrFunc)(int, int); // 声明一个指向函数的指针

ptrFunc = add; // 函数名本身即是函数的地址

int result = (*ptrFunc)(10, 20); // 通过指针调用函数
printf("函数指针调用结果为:%d\n", result);

这些是指针在C语言中更多的应用场景,涉及函数返回值、指针数组、多级指针和指向函数的指针等。掌握这些概念和用法可以更好地利用指针完成各种复杂的编程任务。要注意正确管理和使用指针,以避免内存泄漏和不必要的错误。

五,习题

1. 指针基础

编写一个程序,声明一个整数变量,然后声明一个指向该变量的指针,最后输出该变量的值和指针的值。

2. 动态内存分配

编写一个程序,要求用户输入一个整数作为数组的大小,然后使用动态内存分配创建一个整数数组,并输出数组的元素。

3. 指针和函数

编写一个函数,接受一个整数数组和数组大小作为参数,并返回数组中的最大值。在主函数中创建一个数组,然后调用这个函数并输出最大值。

4. 字符串和指针

编写一个函数,接受一个字符串作为参数,然后统计并返回字符串中的字符数(不包括空字符'\0')。在主函数中输入一个字符串并调用这个函数,输出字符数。

5. 指针和结构体

定义一个包含学生姓名和年龄的结构体,然后创建一个指向该结构体的指针。输入学生信息并使用指针输出学生的姓名和年龄。

6. 指针数组

创建一个包含5个整数指针的数组,并将每个指针指向一个不同的整数。然后通过数组来访问和修改这些整数的值。

7. 指针和多级指针

编写一个函数,将一个整数数组中的所有元素翻转,并使用多级指针完成这个任务。

欢迎大家在评论区讨论😄


总的来说,指针是 C 语言中非常重要的概念,允许直接处理内存地址和数据引用,但需要小心谨慎地使用,以避免出现错误或安全问题。

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝴蝶也姓胡 ye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值