C语言-详细介绍-*符号

*符号在 C 语言中是一个非常强大且多功能的符号,它涵盖了从基本的乘法运算到复杂的指针操作、函数调用和内存管理等方面。下面总结了*符号的功能和使用场景。

目录

一、乘法运算符:

二、指针声明符:

三、解引用运算符:

四、函数参数中的指针和解引用:

[五、动态内存分配和 *:](#五、动态内存分配和 *:)

[六、指针算术和 *:](#六、指针算术和 *:)

[七、指针数组和 *:](#七、指针数组和 *:)

[八、函数指针和 *:](#八、函数指针和 *:)


一、乘法运算符

  • 最基本的功能是作为乘法运算符,用于计算两个操作数的乘积。

二、指针声明符

  • * 出现在变量声明中,它表示该变量是一个指针,用于存储地址。
cpp 复制代码
int* ptr;  // 声明一个指向整数的指针
char* str; // 声明一个指向字符的指针
  • 对于更复杂的指针类型,例如二级指针:
cpp 复制代码
int** ptr2;  // 声明一个指向整数指针的指针
  • 这里 ptr2 可以存储一个 int* 类型指针的地址。

三、解引用运算符

  • * 用于指针变量时,它是解引用运算符,允许访问或修改指针所指向的内存位置存储的值。
  • 解引用操作的本质是根据指针存储的地址找到相应的内存位置,并对该位置的数据进行操作。
  • 注意,使用解引用操作符时,必须确保指针已正确初始化,否则可能导致未定义行为(如访问非法地址)。
cpp 复制代码
int num = 10;
int* ptr = #  // ptr 存储 num 的地址
*ptr = 20;      // 通过解引用修改 num 的值,现在 num 的值为 20

四、函数参数中的指针和解引用

  • 在函数参数中使用指针,可以实现按引用传递,允许函数修改传递的参数。
cpp 复制代码
void modify(int* ptr) {
    *ptr = 100;  // 修改 ptr 所指向的变量的值
}

int main() {
    int value = 50;
    modify(&value);  // 传递 value 的地址
    // 现在 value 的值为 100
    return 0;
}
  • 对于数组作为参数,实际上传递的是数组首元素的指针,因此可以在函数内使用 * 进行操作。
cpp 复制代码
void printArray(int* arr, int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", *(arr + i));  // 等价于 arr[i]
    }
}

int main() {
    int array[] = {1, 2, 3, 4, 5};
    printArray(array, 5);
    return 0;
}

五、动态内存分配和 *

  • 在使用 malloccallocrealloc 等函数进行动态内存分配时,返回的是一个指针,通常需要使用 * 来存储和操作分配的内存。
cpp 复制代码
int* dynamicArray = (int*)malloc(sizeof(int) * 5);  // 分配可以存储 5 个整数的内存空间
for (int i = 0; i < 5; i++) {
    *(dynamicArray + i) = i + 1;  // 对分配的内存进行赋值,等价于 dynamicArray[i] = i + 1;
}
free(dynamicArray);  // 释放分配的内存

六、指针算术和 *

  • 可以使用 * 与指针算术结合,实现对数组和其他数据结构的操作。
cpp 复制代码
int array[] = {1, 2, 3, 4, 5};
int* ptr = array;  // 指向数组的第一个元素
for (int i = 0; i < 5; i++) {
    printf("%d ", *(ptr + i));  // 打印数组元素,等价于 ptr[i]
}

七、指针数组和 *

  • 对于指针数组,* 可以用来访问数组元素所指向的数据。
cpp 复制代码
char* strings[] = {"Hello", "World"};
printf("%s\n", *strings);  // 打印 "Hello"
printf("%s\n", *(strings + 1));  // 打印 "World"

八、函数指针和 *

  • 可以使用 * 声明和使用函数指针。
cpp 复制代码
int add(int a, int b) {
    return a + b;
}

int main() {
    int (*funcPtr)(int, int);  // 声明一个函数指针
    funcPtr = add;  // 赋值函数指针
    int result = (*funcPtr)(3, 4);  // 调用函数指针,等价于 funcPtr(3, 4)
    return 0;
}
相关推荐
Vanranrr2 分钟前
nullptr vs NULL:C/C++ 空指针的演变史
c语言·c++
机灵猫8 分钟前
深入理解 Java 类加载与垃圾回收机制:从原理到实践
java·开发语言
weixin_307779139 分钟前
AWS Redshift 数据仓库完整配置与自动化管理指南
开发语言·数据仓库·python·云计算·aws
Sunsets_Red11 分钟前
差分操作正确性证明
java·c语言·c++·python·算法·c#
伐尘30 分钟前
【Qt】QTableWidget 自定义排序功能实现
开发语言·qt
第七序章1 小时前
【C++】AVL树的平衡机制与实现详解(附思维导图)
c语言·c++·人工智能·机器学习
多多*1 小时前
上传文件相关业务,采用策略模式+模版方法模式进行动态解耦
java·开发语言
赴前尘1 小时前
Go 通道非阻塞发送:优雅地处理“通道已满”的场景
开发语言·后端·golang
weixin_456904272 小时前
以太网与工业以太网通信C#开发
开发语言·c#
野猪亨利6672 小时前
Qt day1
开发语言·数据库·qt