c语言指针的应用

 一.地址与指针

        指针相对于一个内存单元来说,指的是单元的地址,该单元的内容里面存放的是数据。在C语言中,允许用指针变量来存放指针。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。

 

二.指针本质     

        C语言的指针是一种特殊的数据类型,它存储了一个内存地址,通常用于访问和操作内存中的变量或对象。指针在C语言中的作用非常关键,主要体现在以下几个方面:

  1. 直接访问变量:通过指针,我们可以直接访问和操作内存中的变量。这意味着我们可以在程序中直接改变变量的值,或者获取变量的地址和大小。
  2. 动态内存分配:C语言中的指针可以和动态内存分配函数(如malloc、calloc等)配合使用,动态地创建和分配内存空间,使得程序可以更加灵活地处理数据。
  3. 引用传递:在函数调用中,使用指针作为参数可以实现引用传递,即直接修改原始参数的值,而不是它的副本。这可以用于修改函数外部的变量,或者避免数据拷贝。
  4. 指针数组和字符串:C语言的字符串本质上是字符数组,可以通过指针来访问和操作;而指针数组则可以用来实现各种复杂的内存布局和数据结构。
  5. 函数指针:指向函数的指针可以用来实现回调函数、函数表等数据结构,使得程序可以更加灵活地调用函数。

理解C语言的指针需要掌握以下几个关键点:

  1. 指针是一种特殊的数据类型,它存储了一个内存地址。
  2. 指针变量需要先定义再使用,定义时需要声明指针类型(即指向的数据类型)。
  3. 可以使用“*”操作符来获取指针指向的变量的值,或者给指针指向的变量赋值。
  4. 可以使用“&”操作符来获取变量的地址,或者给指针变量赋值。
  5. 指针的算术运算:两个指针相减得到它们之间的元素个数差,两个指针相加得到它们之间相隔的元素个数。
  6. 空指针:NULL是一个特殊的指针值,表示没有指向任何变量。试图访问空指针指向的内存将导致未定义行为。
  7. 指针比较:两个相同类型的指针可以进行比较操作,比较结果由它们所存储的内存地址决定。

总的来说,掌握C语言的指针需要理解其基本概念和操作,同时需要在实践中多加练习和应用。

三.指针之间的赋值

(1) 指针赋值    

        指针赋值和int变量赋值一样,就是将地址的值拷贝给另外一个。指针之间的赋值是一种浅拷贝,是在多个编程单元之间共享内存数据的高效的方法。

1.图解

2.代码
#include <stdio.h>

int main() {
	int  num = 100;
	int* p1  = &num;
	int* p3 = p1;//通过指针 p1 、 p3 都可以对内存数据 num 进行读写,如果2个函数分别使用了p1 和p3,那么这2个函数就共享了数据num。
	printf("num = %d , p1 = %d , p3 = %d \n", num, *p1, *p3);
	printf("&num = %p, p1 = %p, p2 = %p \n",&num, p1, p3);
}

3.结果

(2)指针的“申请”和“释放”

        在c语言中,使用malloc()calloc()来申请内存。这些函数会返回一个指向所分配内存的指针。如果我们不使用这些函数,而直接使用一个未初始化的指针,可能会导致程序崩溃或不可预期的行为。

1.代码
#include <stdio.h>
#include <stdlib.h>

int main(){
	int *p = NULL;
	p = malloc(sizeof(int)); // 申请一个指向int类型的指针
	*p = 10; // 通过指针p给申请的内存赋值
	printf("%d\n",*p);
	free(p);
	printf("%d\n",*p);
}
2.结果

3.注意

   malloc()calloc()都是C语言中的函数,用于在堆上动态分配内存。使用方法如下:

   1.malloc()函数接受一个参数,即需要分配的字节数。它返回一个指向分配的内存的指针,如果分配失败则返回NULL

例:

#include <stdio.h>
#include <stdlib.h>
int main(){
    int *ptr = (int*)malloc(sizeof(int)); 
    if(ptr == NULL) { 
    printf("Memory allocation failed\n"); 
    exit(0); 
    } 
    *ptr = 10; 
    printf("Value of ptr: %d\n", *ptr); 
    free(ptr);
}

        在这个示例中,我们使用malloc()分配了一个足够大的内存来存储一个整数,然后我们检查是否成功分配了内存。如果内存分配失败,我们会打印一个错误消息并退出程序。如果内存分配成功,我们将整数10存储在我们刚刚分配的内存中,然后打印这个值。最后,我们使用free()释放我们分配的内存。

   2.calloc()函数接受两个参数,即需要分配的内存块的数量和每个内存块的字节大小。它返回一个指向分配的内存的指针,如果分配失败则返回NULL。与malloc()不同,calloc()会初始化新分配的内存为0。

例:

#include <stdio.h>
#include <stdlib.h>
int main(){
    int *ptr = (int*)calloc(1, sizeof(int)); 
    if(ptr == NULL) { 
    printf("Memory allocation failed\n"); 
    exit(0); 
    } 
    *ptr = 10; 
    printf("Value of ptr: %d\n", *ptr); 
    free(ptr);
}

        在这个示例中,我们使用calloc()分配了一个足够大的内存来存储一个整数,并初始化为0。然后我们检查是否成功分配了内存。如果内存分配失败,我们会打印一个错误消息并退出程序。如果内存分配成功,我们将整数10存储在我们刚刚分配的内存中,然后打印这个值。最后,我们使用free()释放我们分配的内存。

四.结论

        本文详细介绍了C语言中的指针,包括其基本概念、类型、声明和使用方法。通过代码实现和结果的分析,我们可以看到指针在C语言中的重要性,以及如何利用指针来提高程序的效率和可靠性。然而,使用指针时也需谨慎,因为错误的指针操作可能会导致程序崩溃或出现不可预期的行为。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我来挖坑啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值