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;
}
相关推荐
又熟了35 分钟前
WDG看门狗(独立看门狗和窗口看门狗)
c语言·stm32·单片机·嵌入式硬件
TPBoreas4 小时前
Jenkins 改完端口号启动不起来了
java·开发语言
TE-茶叶蛋4 小时前
Vuerouter 的底层实现原理
开发语言·javascript·ecmascript
柒柒的代码学习日记5 小时前
数组和指针典型例题合集(一维数组、字符数组、二维数组)
c语言
云闲不收5 小时前
设计模式原则
开发语言
秋名RG5 小时前
深入解析建造者模式(Builder Pattern)——以Java实现复杂对象构建的艺术
java·开发语言·建造者模式
技术求索者5 小时前
c++学习
开发语言·c++·学习
山猪打不过家猪6 小时前
(二)毛子整洁架构(CQRS/Dapper/领域事件处理器/垂直切片)
开发语言·.net
方博士AI机器人8 小时前
Python 3.x 内置装饰器 (4) - @dataclass
开发语言·python
weixin_376934638 小时前
JDK Version Manager (JVMS)
java·开发语言