指针用法及分类

简介: 指针用法及分类

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


1.指针的具体用法如下:


1.声明指针变量

int *ptr; // 声明一个指向整型变量的指针
char *ptr_char; // 声明一个指向字符型变量的指针

2.获取变量的地址

int num = 10;
int *ptr_num = # // 将num的地址赋给ptr_num

3.通过指针访问变量的值:

int value = *ptr_num; // 通过ptr_num指针访问num的值

4.指针的算术运算:

int arr[5] = {1, 2, 3, 4, 5};
int *ptr_arr = arr; // 指向数组arr的第一个元素
int third_element = *(ptr_arr + 2); // 访问数组arr的第三个元素

5.指针作为函数参数:

void increment(int *ptr) {
    (*ptr)++; // 递增ptr指向的变量的值
}
int num = 5;
increment(&num); // 将num的地址传递给increment函数

2.指针参数的具体用法如下:


1.传递变量的地址:

void modifyValue(int *ptr) {
    *ptr = 100; // 修改ptr指向的变量的值为100
}
int num = 5;
modifyValue(&num); // 将num的地址传递给modifyValue函数

2.传递数组:

void printArray(int *arr, int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]); // 访问数组元素
    }
}
int numbers[] = {1, 2, 3, 4, 5};
printArray(numbers, 5); // 将数组名作为指针传递给printArray函数

3.返回多个值:

void calculate(int a, int b, int *sum, int *difference) {
    *sum = a + b;
    *difference = a - b;
}
int result_sum, result_diff;
calculate(10, 5, &result_sum, &result_diff); // 返回两个计算结果

4.动态内存分配:

void allocateMemory(int **ptr) {
    *ptr = (int *)malloc(sizeof(int)); // 分配内存
}
int *dynamic_ptr;
allocateMemory(&dynamic_ptr); // 将指向指针的指针传递给函数
通过使用指针参数,可以实现对函数外部变量的修改,传递数组和动态内存分配等功能。

3.指针函数是指返回值为指针类型的函数


#include <stdio.h>
int* createArray(int size) {
    int* arr = (int*)malloc(size * sizeof(int));  // 动态分配内存空间
    for (int i = 0; i < size; i++) {
        arr[i] = i + 1;
    }
    return arr;
}
int main() {
    int size = 5;
    int* arr = createArray(size);
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    free(arr);  // 释放内存空间
    return 0;
}

在这个例子中,createArray 函数将返回一个指向动态分配的数组的指针。在 main 函数中调用 createArray 函数,并打印出返回的数组的元素。最后需要记得使用 free 函数释放分配的内存空间。


指针函数在需要返回动态分配内存空间或其他需要返回地址的场景中非常有用。通过返回指针,可以在函数外部访问和操作这些内存空间。


4.函数指针是指向函数的指针变量


函数指针的声明方式如下:


返回值类型 (*指针变量名)(参数列表)

例如,声明一个指向返回类型为int、参数列表为int和int的函数的指针变量,可以使用以下语句:


int (*ptr)(int, int);

函数指针的赋值方式有两种:

1.直接将函数名赋值给指针变量。例如:


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

2.使用取函数地址的操作符&。例如


int (*ptr)(int, int);
ptr = &add;
 

通过函数指针调用函数的方式有两种:

  1. 使用指针变量名加括号调用。例如:
1. int result = (*ptr)(3, 4);
2.

2.使用指针变量名加函数名调用。例如:

1. int result = ptr(3, 4);
2.

函数指针可以作为函数的参数和返回值,从而实现函数的动态调用。例如:

int add(int a, int b) {
    return a + b;
}
 
int subtract(int a, int b) {
    return a - b;
}
 
int calculate(int a, int b, int (*ptr)(int, int)) {
    return ptr(a, b);
}
 
int main() {
    int result1 = calculate(3, 4, add);
    int result2 = calculate(3, 4, subtract);
    
    return 0;
}
 

通过函数指针,可以实现函数的动态调用,提高代码的灵活性和可扩展性。

相关文章
|
1月前
|
存储 算法
LeetCode刷题---75. 颜色分类(双指针,循环不变量)
LeetCode刷题---75. 颜色分类(双指针,循环不变量)
|
1月前
|
存储 C语言 索引
【c语言指针详解】复杂数据结构的指针用法
【c语言指针详解】复杂数据结构的指针用法
87 0
|
1月前
|
存储 C语言
【c语言指针详解】指针的基本概念和用法
【c语言指针详解】指针的基本概念和用法
82 0
|
8月前
|
C语言
通过模拟实现计算器介绍函数指针数组和回调函数的用法【C语言/指针/进阶】
通过模拟实现计算器介绍函数指针数组和回调函数的用法【C语言/指针/进阶】
54 0
|
9月前
|
程序员 C++
智能指针避坑指南——几种常见的错误用法
智能指针避坑指南——几种常见的错误用法
|
9月前
|
C++
C++ 底层语言的信仰-指针分类
C++ 底层语言的信仰-指针分类
|
2天前
|
算法
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
|
2天前
|
算法 容器
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和
|
8天前
|
测试技术 C++ 开发者
智慧指针是什么以及具体用法
智慧指针是什么以及具体用法
7 2
|
1月前
|
存储 安全 程序员
【C++ 包装器类 智能指针】完全教程:std::unique_ptr、std::shared_ptr、std::weak_ptr的用法解析与优化 — 初学者至进阶指南
【C++ 包装器类 智能指针】完全教程:std::unique_ptr、std::shared_ptr、std::weak_ptr的用法解析与优化 — 初学者至进阶指南
112 0