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;
}
相关推荐
小七蒙恩22 分钟前
java下载文件流,不生成中间文件。
java·开发语言·状态模式
计算机_CodeMind28 分钟前
基于微信小程序的校园点餐平台的设计与实现(源码+SQL+LW+部署讲解)
开发语言·微信小程序·springboot·课程设计
码喽不秃头1 小时前
java中的特殊文件
java·开发语言
新手小袁_J1 小时前
Python的列表基础知识点(超详细流程)
开发语言·python·numpy·pip·基础知识·基础知识点
jf加菲猫1 小时前
条款35:考虑虚函数以外的其它选择(Consider alternatives to virtual functions)
开发语言·c++
听风吟丶1 小时前
深入探究 Java hashCode:核心要点与实战应用
java·开发语言
【D'accumulation】1 小时前
深入聊聊typescript、ES6和JavaScript的关系与前瞻技术发展
java·开发语言·前端·javascript·typescript·es6
AI人H哥会Java2 小时前
【Spring】Spring DI(依赖注入)详解——自动装配——手动装配与自动装配的区别
java·开发语言·后端·spring·架构
开心工作室_kaic2 小时前
springboot502基于WEB的牙科诊所管理系统(论文+源码)_kaic
开发语言·前端·数据库·智能手机·美食
安全小王子2 小时前
攻防世界web第十题Web_python_template_injection
开发语言·前端·python