龙空技术网

深入学习C语言:指针的高级用法

嵌入式讲堂 894

前言:

目前小伙伴们对“c语言和指针”大约比较注重,看官们都需要知道一些“c语言和指针”的相关内容。那么小编也在网上网罗了一些关于“c语言和指针””的相关知识,希望咱们能喜欢,大家快快来了解一下吧!

嵌入式相关的技术知识

欢迎大家留言讨论,相互交流

关注号主,共同进步

如有错误欢迎指正

目录介绍指针的基础用法数组指针指针数组二级指针函数指针指针函数const指针的不同用法总结介绍指针的基础用法

指针是C语言中最重要也最难理解的概念之一。在基础使用方面,指针主要用于访问和操作变量的地址。例如,我们可以通过以下方式定义并使用一个指针:

int x = 1;int* ptr = &x;*ptr = 2;printf("%d\n", x); // 输出 2

在上面的例子中,我们首先定义了一个整型变量x,然后使用&运算符获取x的地址,并将其赋值给指针ptr。接着,我们使用*运算符来访问指针所指向的变量,并将该变量的值修改为2。最后,我们使用printf函数输出变量x的值,结果为2。

数组指针

数组指针是指针指向一个数组,使得指针可以像一个数组一样来操作数据。例如:

int arr[3] = {1, 2, 3};int (*pArr)[3]; // 定义一个指向数组类型的指针pArr = &arr; // 指针pArr指向数组arr(*pArr)[0] = 4; // 访问数组元素printf("%d\n", arr[0]); // 输出 4

在上面的代码中,我们首先定义了一个整型数组arr,然后定义了一个指向数组类型的指针pArr,并将其指向数组arr。接着,我们通过pArr指针来访问数组的元素,并修改了其中一个元素的值。最后,我们输出数组的第一个元素,结果为4。

指针数组

指针数组是数组中的每个元素都是指针。通常我们使用指针数组来表示相同类型的元素。例如:

char *days[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

在上面的例子中,days是一个指针数组,其中每个元素都是指向字符的指针。

指针数组常常与函数指针结合使用。例如,我们可以使用函数指针来实现一个简单的计算器:

int add(int a, int b) {    return a + b;}int sub(int a, int b) {    return a - b;}int (*func_ptr[2])(int, int) = {add, sub};int main() {    int x = 1, y = 2;    printf("%d\n", func_ptr[0](x, y));    printf("%d\n", func_ptr[1](x, y));    return 0;}

在上面的示例中,我们定义了一个存储函数指针的指针数组func_ptr,其中包含两个函数指针add和sub。接着,我们定义了两个整型变量x和y,并在main函数中调用了数组中的函数指针来进行加减运算。

二级指针

二级指针是指针的指针。在需要动态分配内存和传递指针时,二级指针可以更方便地实现。下面是一个使用二级指针来交换变量值的示例:

void swap(int** x, int** y) {    int* tmp = *x;    *x = *y;    *y = tmp;}int main() {    int x = 1, y = 2;    int* ptr_x = &x;    int* ptr_y = &y;    swap(&ptr_x, &ptr_y);    printf("x = %d, y = %d\n", *ptr_x, *ptr_y);    return 0;}

在上面的示例中,函数swap的参数类型是二级指针,可以在内部交换两个指针的值,达到交换变量的效果。

函数指针

函数指针是指向函数的指针变量。在实际开发过程中,我们常常需要通过函数指针来实现回调函数方法。下面是一个简单的示例:

void say_hello() {    printf("Hello, World!\n");}void execute(void (*f)()) {    f();}int main() {    execute(say_hello);    return 0;}

在上面的代码中,我们定义了一个函数say_hello用于输出"Hello, World!"。接着,我们定义了一个名为execute的函数,其参数类型为函数指针void (*f)(),表示参数是一个不返回值且没有参数的函数指针。在main函数中,我们调用execute函数并传入say_hello函数的函数指针作为参数,程序输出"Hello, World!"。

指针函数

指针函数是返回指针类型值的函数。使用指针函数可以方便地获取函数内部申请的内存地址,并将其传递到程序的其他部分。下面是一个简单的示例:

char* get_memory(int size) {    char* ret = (char*) malloc(size);    return ret;}int main() {    char* str = get_memory(strlen("Hello, World!") + 1);    strcpy(str, "Hello, World!");    printf("%s\n", str);    free(str);    return 0;}

在上面的代码中,我们定义了一个指针函数get_memory,该函数申请了一块内存并返回一个指向该内存的指针。在main函数中,我们调用get_memory函数并传入需要申请的内存大小。接着,我们使用strcpy函数将字符串"Hello, World!"复制到申请的内存空间中,并输出该字符串。最后,我们释放了申请的内存空间。

const指针的不同用法

const指针是指一个指向常量的指针,即指针所指向的值不能被修改。它可以有以下几种用法:

const int *ptr:指向常量的指针,指针指向的值不能被修改。int *const ptr:指向变量的常量指针,指针本身的值不能被修改。const int *const ptr:指向常量的常量指针,指针本身的值和指针指向的值都不能被修改。

例如,下面的代码定义了一个指向整数变量a的常量指针,以及一个指向常量整数b的指针:

int a = 1;const int b = 2;const int *ptr1 = &a;int *const ptr2 = (int *)&b;const int *const ptr3 = &b;

在使用const指针时,需要注意以下几点:

指针所指向的值不能被修改。需要使用强制类型转换来绕过const限制。

// 使用const指针*ptr1 = 2; // 错误,不能修改指针所指向的值*ptr2 = 3; // 正确,可以修改指针所指向的值ptr3 = &a; // 错误,不能修改指针本身的值// 绕过const限制*(int *)&b = 3;
总结

指针作为一种强大的工具,具有很多复杂的使用方法。掌握了这些高级用法,可以更好地理解和使用C语言,进一步提高程序的质量和效率。在实际开发过程中,根据具体的业务场景和需求,灵活使用指针的各种高级用法,可以让我们写出更加高效和可靠的程序。

欢迎来到【嵌入式讲堂】

专注嵌入式技术交流

操作系统,算法,编程语言知识分享

欢迎大家一起讨论,让我们共同进步

标签: #c语言和指针