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;
}
相关推荐
智者知已应修善业13 小时前
【51单片机单按键控制2个LED循环闪烁】2022-12-7
c语言·经验分享·笔记·嵌入式硬件·51单片机
Florence2313 小时前
GPU硬件架构和配置的理解
开发语言
笑口常开xpr13 小时前
Linux动静态库开发基础:静态库与动态库的编译构建、链接使用及问题排查
linux·c语言·动态库·静态库
李游Leo14 小时前
JavaScript事件机制与性能优化:防抖 / 节流 / 事件委托 / Passive Event Listeners 全解析
开发语言·javascript·性能优化
JJJJ_iii14 小时前
【左程云算法09】栈的入门题目-最小栈
java·开发语言·数据结构·算法·时间复杂度
枫叶丹414 小时前
【Qt开发】显示类控件(三)-> QProgressBar
开发语言·qt
三体世界14 小时前
测试用例全解析:从入门到精通(1)
linux·c语言·c++·python·功能测试·测试用例·测试覆盖率
Bear on Toilet15 小时前
继承类模板:函数未在模板定义上下文中声明,只能通过实例化上下文中参数相关的查找找到
开发语言·javascript·c++·算法·继承
程序员东岸15 小时前
C语言入门指南:字符函数和字符串函数
c语言·笔记·学习·程序人生·算法
码猿宝宝15 小时前
浏览器中javascript时间线,从加载到执行
开发语言·javascript·ecmascript