c语言指针经典问题(交换两个数字)

本文通过两个实例介绍如何使用C语言实现两个数字的互换及数组排序。首先展示了如何利用指针来交换两个整数变量的值,并解释了直接传递变量为何无法达到预期效果。随后介绍了如何输入一组数字并对其进行升序排列。
1.互换两个数字:

# include<stdio.h>
void g(int * p,int * q)
{
    int t;          //如果要互换*p*q的值,则t必须定义为int,
    t = * p;         //不能定义为int*,否则会有语法错误.
    * p =  * q;
    * q = t;
}
int main()
{
    int a=3, b=5;
    g(&a,&b);
    printf("a = %d ",a);
    printf("b = %d ",b);
    return 0;
}

/*
#include<stdio.h>
void f(int a,int b)       //该函数不能完成互换功能!
{
    int t;
    t = a;
    a = b;
    b = t;
}
int main()
{
    int a=3,b=5;
    f(a,b);
    printf("a = %d ",a);
    printf("b = %d ",b);


    return 0;
}
*/

/*
# include<stdio.h>
void g(int * p,int * q)      //不能完成互换功能
{
    int * t;   //如果要互换指针变量,必须是int,不能是int*
    t = p;
    p = q;
    q = t;
}
int main()
{
    int a=3, b=5;
    g(&a,&b);
    printf("a = %d ",a);
    printf("b = %d ",b);
    return 0;
}
*/



2.输入n个数,按从小到大的顺序输出:

#include <stdio.h>
#include <malloc.h>
int main(void)
{
    int i,j,t,len;
    int *p;
    printf("请输入所排数的个数:\n");
    scanf("%d",&len);
    p=(int *)malloc(4*len);                       //    对数组赋值
    printf("输入所要排序的数\n");
    for(i=0;i<len;++i)
    scanf("%d",&p[i]);
    printf("\n");
    for(i=0;i<len-1;++i)               //大方面的循环,次数结束一次得出一个最大值放在最后
        for(j=0;j<len-i-1;++j)         //在每趟中进行循环 要考虑到下面的j+1
    if(p[j]>p[j+1])                        //相邻两个数比较
    {
        t=p[j];p[j]=p[j+1];p[j+1]=t;
    }
    for(i=0;i<len;++i)               //对结果输出
    printf("%d ",p[i]);
    return 0;
}
/*结论非常重要
for (i=0;i<n-1;++i)
    for (j=0;j<n-1-i;++j)
    if (a[j]>a[j+1])
{
    t=a[j];a[j]=a[j+1];a[j+1]=t;
}
*/

<think>我们正在讨论使用C语言指针实现两个数字互换的方法。根据引用[1]和引用[5],我们可以看到两个典型的例子。 引用[1]中的代码示例: ``` #include<stdio.h> int main() { int a,b,t; int *pa,*pb; pa=&a; pb=&b; printf("please input the two digits a and b:\n"); scanf("%d%d",pa,pb); // 注意这里没有取地址,因为pa和pb已经是指针 printf("before the swap:\n"); printf(" a=%d b=%d\n",*pa,*pb); t=*pa; *pa=*pb; *pb=t; printf("after the swap:\n"); printf(" a=%d b=%d\n",*pa,*pb); return 0; } ``` 引用[5]中的代码示例则是通过函数实现的: ``` #include <stdio.h> int main(void) { int a,b; void swap(int *p1,int *p2); scanf("%d,%d",&a,&b); printf("%d,%d\n",a,b); swap(&a,&b); // 传递a和b的地址 printf("%d,%d\n",a,b); return 0; } void swap(int *p1,int *p2) { int t; t = *p1; *p1 = *p2; *p2 = t; } ``` 这种方法本质相同,都是通过指针直接操作内存地址来交换两个变量的值。 另外,引用[2]中提到了使用结构体进行交换,但这不是题目要求的指针交换两个整数的方法,所以不作为重点。 因此,我们可以总结出种常见的指针交换方式:一种是在主函数内直接通过指针交换(如引用[1]),另一种是通过函数传递指针数进行交换(如引用[5])。 下面我将分别给出这种方式的代码示例: </think>### 使用C语言指针实现两个数字互换的方法 在C语言中,通过指针交换两个变量的值是最直接的内存级操作方式。核心原理是:**通过指针直接访问变量内存地址,操作原始数据**。以下是种典型实现方法: --- #### 方法1:在`main`函数内直接交换 [^1][^5] ```c #include <stdio.h> int main() { int a, b, temp; int *pa = &a, *pb = &b; // 定义指针并初始化 printf("输入两个整数: "); scanf("%d%d", pa, pb); // 通过指针输入值 printf("交换前: a=%d, b=%d\n", a, b); // 指针交换逻辑 temp = *pa; // 暂存a的值 *pa = *pb; // 将b的值赋给a *pb = temp; // 将暂存值赋给b printf("交换后: a=%d, b=%d\n", a, b); return 0; } ``` --- #### 方法2:通过函数封装交换逻辑 [^2][^5] ```c #include <stdio.h> // 交换函数 (指针) void swap(int *p1, int *p2) { int temp = *p1; // 解引用获取p1指向的值 *p1 = *p2; // 将p2指向的值赋给p1指向的内存 *p2 = temp; // 用暂存值更新p2指向的内存 } int main() { int x, y; printf("输入两个整数: "); scanf("%d%d", &x, &y); printf("交换前: x=%d, y=%d\n", x, y); swap(&x, &y); // 传递变量地址 printf("交换后: x=%d, y=%d\n", x, y); return 0; } ``` --- ### 关键说明 1. **指针操作本质** 通过`*pa`直接修改内存地址中的数据(如`*pa = *pb`),避免了值传递的拷贝问题[^1]。 2. **函数交换的优势** 封装后代码可重用,适用于任何整型变量交换,且符合模块化设计原则[^2][^5]。 3. **注意事项** - 必须确保指针已初始化(如`int *pa = &a`) - 函数调用时需传递变量地址(`swap(&x, &y)`) - 避免操作野指针(未初始化的指针) --- ### 执行流程示意图 ```mermaid graph LR A[声明变量 a, b] --> B[定义指针 pa=&a, pb=&b] B --> C[通过指针输入值] C --> D[temp = *pa] D --> E[*pa = *pb] E --> F[*pb = temp] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值