*符号在 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;
}
五、动态内存分配和 *
:
- 在使用
malloc
、calloc
和realloc
等函数进行动态内存分配时,返回的是一个指针,通常需要使用*
来存储和操作分配的内存。
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;
}