11.函数传指针

本文详细解析了C语言中指针的基本概念、使用方法及其在不同场景下的应用,通过具体实例展示了指针如何实现数据交换、传递参数等操作。同时,解答了关于指针占用内存空间、类型区分等问题,帮助读者更好地掌握指针这一核心知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//  main.c

//  指针例子1



#include <stdio.h>



//void swap(char v1, char v2) {

//    printf("交换之前之前:v1=%d,v2=%d\n", v1, v2);

//    

//    char temp;

//    

//    temp = v1;

//    v1 = v2;

//    v2 = temp;

//    

//    printf("调用函数之后:v1=%d,v2=%d\n", v1, v2);

//}


void swap(char *v1, char *v2) {

    char temp;

    

    temp = *v1;

    *v1 = *v2;

    *v2 = temp;

}


int main(int argc, const char * argv[])

{

    char a = 10;

    char b = 9;

    

    printf("调用函数之前:a=%d,b=%d\n", a, b);

    

    swap(&a, &b);

    

    printf("调用函数之后:a=%d,b=%d\n", a, b);

    return 0;

}


16221226-a4bb0188f19041f58d0aeff2ce3847be.png





//  main.c

//  指针例子2

//

//  Created by mj on 13-3-26.

//  Copyright (c) 2013 itcast. All rights reserved.

//  指针类型存地址,可以是指针也可以是一个变量的地址


#include <stdio.h>


int sumAndMinus(int v1, int v2, int *p) {

    *p = v1 - v2;

    return v1 + v2;

}


int main(int argc, const char * argv[])

{

    int a = 10;

    int b = 4;

    

    // 接收ab的和

    int sum;

    // 接收ab的差

    int minus;

    

    sum = sumAndMinus(a, b, &minus);

    

    printf("sum=%d, mimus=%d", sum, minus);

    return 0;

}

六、关于指针的疑问

刚学完指针,都可能有一大堆的疑惑,这里我列出几个常见的疑惑吧。

1.一个指针变量占用多少个字节的内存空间?占用的空间是否会跟随所指向变量的类型而改变?

在同一种编译器环境下,一个指针变量所占用的内存空间是固定的。比如,在16位编译器环境下,任何一个指针变量都只占用2个字节,并不会随所指向变量的类型而改变。

 

2.既然每个指针变量所占用的内存空间是一样的,而且存储的都是地址,为何指针变量还要分类型?而且只能指向一种类型的变量?比如指向int类型的指针、指向char类型的指针。

其实,我觉得这个问题跟"数组为什么要分类型"是一样的。

* 看下面的代码,利用指针p读取变量c的值

复制代码
1 int i = 2;
2 char c = 1;
3 
4 // 定义一个指向char类型的指针
5 char *p = &c;
6 
7 // 取出
8 printf("%d", *p);
复制代码

这个输出结果应该难不倒大家:,是可以成功读取的。

如果我改一下第5行的代码,用一个本应该指向int类型变量的指针p,指向char类型的变量c

int *p = &c;

我们再来看一下输出:c的原值是1,现在取出来却是513,怎么回事呢?这个要根据内存来分析

根据变量的定义顺序,这些变量在内存中大致如下图排布:

其中,指针变量p和int类型变量i各占2个字节,char类型的c占一个字节,p指向c,因此p值就是c的地址

1> 最初的时候,我们用char *p指向变量c。当利用*p来获取变量c的值时,由于指针p知道变量c是char类型的,所以会从ffc3这个地址开始读取1个字节的数据:0000 0001,转为10进制就是1

2> 后来,我们用int *p指向变量c。当利用*p获取变量c的值时,由于指针p认为变量c是int类型的,所以会从ffc3这个地址开始读取2个字节的数据:0000 0010 0000 0001,转为10进制就是513



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值