C-指针与函数的关系

本文展示了C语言中函数参数传递的不同方式,包括传值和传地址。通过示例说明了传值时参数在函数内部的改变不会影响外部变量,而传地址则可以实现变量值的真正交换。同时,文章还讨论了传数组、指针和指针函数的概念,强调了指针在处理数组和动态内存分配时的重要性。

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

  • 传数值
#include <stdio.h>

// 函数的传参方式之数值传参

void myfun2(int p,int q)
{
    int tmp;
    tmp = p;
    p = q;
    q = tmp;

    printf("in fun2:  p = %d, q = %d\n", p, q);  // in fun2:  p = 20, q = 100
    printf("&p = %p, &q = %p\n", &p ,&q);        // &p = 0060FE80, &q = 0060FE84
}

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

    int a = 100 , b =20;
    printf("a=%d, b=%d\n", a, b);              // a=100, b=20
    myfun2(a, b);

    printf("&a = %p, &b = %p\n", &a, &b);      // &a = 0060FE9C, &b = 0060FE98
    printf("a=%d, b=%d\n", a, b);              // a=100, b=20

    return 0;
}


  • 传地址
#include <stdio.h>

// 函数的传参方式之地址传参  将实参的地址传递给形参

void myfun2(int *p,int *q)
{
    int tmp;
    tmp = *p;
    *p = *q;
    *q = tmp;

    printf("in fun2:  *p = %d, *q = %d\n", *p, *q);   // in fun2:  *p = 20, *q = 100
    printf("p = %p, q = %p\n", p ,q);                 // p = 0060FE9C, q = 0060FE98
}

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

    int a = 100 , b =20;
    myfun2(&a, &b);
  
    printf("&a = %p, &b = %p\n", &a, &b);      // &a = 0060FE9C, &b = 0060FE98
    printf("a=%d, b=%d\n", a, b);              // a=20, b=100

    return 0;
}


注意:举例 ==>传值和传地址对比案例

#include <stdio.h>



void fun(char *p)
{
    p = "hello kitty";
}

void fun2(char **q)
{
    *q = "hello kitty2";
}

int main(int argc, char *argv[])
{
    char *p  = "hello world";
    fun(p);             // 这里是传的值
    printf("%s\n", p);  // hello world

    char *p1 = "hello world";
    fun2(&p1);            // 这里传的是地址
    printf("%s\n", p1);   // hello kitty2


    return 0;
}


将数组作为参数传递给函数,本质都是地址传参

  • 传数组
#include <stdio.h>

// 传一维数组
//void fun1(int p[])
void fun1(int *p)
{
    printf("%d\n",p[2]);       // 3
    printf("%d\n", *(p+3));    // 4
    // printf("%d\n", *p + 3);    // 4
    printf("%d\n", *(p + 7));    // 8
    // printf("%d\n", *(p + 10));    //

}
void test2()
{
    int a[10] = {1,2,3,4,5,6,7,8};
    fun1(a);
}


// 传二维数组
//void fun2(int p[][4])
void fun2( int (*p)[4] )    // 数组指针的方式
{
    printf("%d\n", p[0][2]);         // 3
    printf("%d\n", *(*(p+1) +2 ));   // 7
}
void test3()
{
    int a[2][4] = {1, 2, 3, 4,
                   5, 6, 7, 8};
    fun2(a);
}


// 传指针数组
void fun3(char **q)   // 这里传的是地址
{
    int i;
    for (i=0; i<3; i++)
    {
        printf("%s\n", q[i]);
        /*
            hello
            world
            kitty
        */
    }
}
void test4()
{
    char *p[3] = {"hello", "world", "kitty"};
    printf("%s\n",*p);       // hello
    printf("%s\n",*(p+1));   // world
    printf("%s\n",*(p+2));   // kitty

    fun3(p);
}



int main(int argc, char *argv[])
{
    test2();
    test3();
    test4();

    return 0;
}


  • 指针函数
#include <stdio.h>

// 指针函数:指针作为函数的返回值
char *fun4()
{
    // char str[100] = "hello world";  // 栈区开辟的空间,会随着当前代码段的结束而释放空间

    static char str[100] = "hello world";  // 静态区的空间不会随着当前代码段的结束而释放空间
    return str;
}
void test5()
{
    char *p;
    p = fun4();
    printf("p = %s\n", p);    // p = hello world
}


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

    test5();

    return 0;
}


  • 函数指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值