鱼C论坛

 找回密码
 立即注册
查看: 1644|回复: 9

[已解决]c---指针初接触

[复制链接]
发表于 2018-7-30 17:39:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>                //输入两个数,然后从小到大输出,中间涉及到指针变量
void swap(int *p1,int *p2);
void main()
{
   
    int a,b,*pointer_1,*pointer_2;
    printf("请输入两个数:\n");
    scanf("%d %d",&a,&b);

    pointer_1 = &a;
    pointer_2 = &b;

    if(a>b)
    {
        
        swap(pointer_1,pointer_2);  //      swap ---> 交换pointer_1和pointer_2

    }
    printf("从小到大一次是:%d,%d\n",*pointer_1,*pointer_2);

}
void swap(int *pointer_1,int *pointer_2)
{
    int *point;
    point = &pointer_1;
    pointer_1 = &pointer_2;
    pointer_2 = &point;
}





//************************************************
// swap函数里 最后三条复制语句有问题吗
//一个不应该加“&”?
//************************************************
//问题出在哪、、、、*******************************
最佳答案
2018-8-1 17:23:09
int a;   定义a是整型变量
&是取地址符 ,&a获得a变量的地址
变量a:有2个属性(一个是变量a,另一个是变量a所对应的地址)
地址的作用:变量a会在内存对应一个点,通过地址能唯一准确的找个这个点。(无论你程序有多复杂,有多少个变量,我都能通过这个地址在内存中准确的找到这个唯一的点)
地址的保存:这时就要用地址的变量来保存地址(变量总要先定一个类型, int*所定义的类型就是地址类型) int* p =&a;地址变量p保存了变量a的地址,也就是指针变量p保存了变量a的地址.
*p 就好理解了,先通过p找到地址,再通过*把地址所对应的变量取出来。 就是*P = a
第二个问题
main()与swap()函数的关系
main()是主程序,swap()是子程序,子程序一般不能改变主程序的内容。(函数得到一个返回值主程序接受下就行了)
如果子程序要改变主程序的变量,通过地址找到变量,把值换下就行了。


void swap(int *p1, int*p2)
{
    int t = *p1;
    *p1 = *p2;
    *p2 = t;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-30 17:54:24 | 显示全部楼层
void swap(int *p1, int*p2)
{
    int t = *p1;
    *p1 = *p2;
    *p2 = t;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-30 17:57:53 | 显示全部楼层
claws0n 发表于 2018-7-30 17:54
void swap(int *p1, int*p2)
{
    int t = *p1;

你这个是 把p1指向的值赋给t,我的那个是把pointer_1地址赋给了pointer,你的肯定没问题,但是我的问题出在哪了能告知一下吗。。。。刚学到指针,有点迷。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-30 18:10:13 | 显示全部楼层
海绵爱上星 发表于 2018-7-30 17:57
你这个是 把p1指向的值赋给t,我的那个是把pointer_1地址赋给了pointer,你的肯定没问题,但是我的问题出 ...

*point, 那麼 point 是指針
point = &pointer_1,是 pointer_1的地址,不是pointer_1,pointer_1 才是存放 a 的地址
pointer_1 = &pointer_2 同理
pointer_2 = (&point == &pointer_1)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-31 10:20:49 | 显示全部楼层
首先说明下。
int *pointer_1;

pointer_1 // 是a地址
&pointer_1 // 是pointer_1的地址
*pointer_1 // 是取a地址的值。也就是a的值。

另指出:
int *point;
函数内定义个指针是要往哪里指?  交换数据用一般的变量暂存即可。

参考代码:
#include <stdio.h>                //输入两个数,然后从小到大输出,中间涉及到指针变量


void swap(int *p1,int *p2);
void main()
{
    
    int a,b,*pointer_1,*pointer_2;


    printf("请输入两个数:\n");
    scanf("%d %d",&a,&b);

    pointer_1 = &a;
    pointer_2 = &b;

    if(a>b)
    {
        
        swap(pointer_1,pointer_2);  //      swap ---> 交换pointer_1和pointer_2

    }
    printf("从小到大一次是:%d,%d\n",*pointer_1,*pointer_2);

}
void swap(int *pointer_1,int *pointer_2)
{
    int temp;
        
    temp = *pointer_1;
    *pointer_1 = *pointer_2;
    *pointer_2 = temp;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-31 15:27:17 | 显示全部楼层
ba21 发表于 2018-7-31 10:20
首先说明下。
int *pointer_1;


假如swap函数中不定义普通变量temp而是定义一个指针变量*pointer(刚学到指针,强行联系到指针),那swap函数应该怎么写
这样写的话问题出在哪:
void swap(int pointer_1,int *pointer_2 ) //
{
      int *pointer;
      pointer = pointer_1;          //这[b]里把指针变量当成普通变量那样交换两个指针变量的地址,
                                             //为什么结果不对                                          
      pointer_1 = pointer_2;
      pointer_2 = pointer;
}

望不吝指教。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-31 16:55:45 | 显示全部楼层
亲,可以看看这篇文章,总结的不错。
值传递,地址传递和引用传递之间的区别。
https://blog.csdn.net/felix_yujing/article/details/38874509#
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-31 19:19:16 | 显示全部楼层
海绵爱上星 发表于 2018-7-31 15:27
假如swap函数中不定义普通变量temp而是定义一个指针变量*pointer(刚学到指针,强行联系到指针),那sw ...
#include <stdio.h>                //输入两个数,然后从小到大输出,中间涉及到指针变量


void swap(int *p1,int *p2);
void main()
{
    
    int a,b,*pointer_1,*pointer_2;


    printf("请输入两个数:\n");
    scanf("%d %d",&a,&b);

    pointer_1 = &a;
    pointer_2 = &b;

    if(a>b)
    {
        
        swap(pointer_1,pointer_2);  //      swap ---> 交换pointer_1和pointer_2

    }
    printf("从小到大一次是:%d,%d\n",*pointer_1,*pointer_2);

}
void swap(int *pointer_1,int *pointer_2)
{
    int *temp;
        // 下面是交换 pointer_1 和 pointer_2 二个指针所存放的地址。 
    temp = pointer_1;
    pointer_1 = pointer_2;
    pointer_2 = temp;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-31 20:13:47 From FishC Mobile | 显示全部楼层
本帖最后由 claws0n 于 2018-7-31 20:17 编辑
海绵爱上星 发表于 2018-7-31 15:27
假如swap函数中不定义普通变量temp而是定义一个指针变量*pointer(刚学到指针,强行联系到指针),那sw ...


Swap(x,y) 其实不一定要透过指针。在学习指针之前应该要先可以掌握回传变量的函数。只不过,指针的方式是最便捷,最有效率的。
如果你在看小甲鱼老师的视频,先往后看一点点,会讲下面的内容。

Int a = 5;
Int *p = &a; //p才是指针,指向a的地址,解引用之后才是整型,也就是a的值 (*p ==a)。

看懂我写什么,那就很快可以掌握指针的基本操作了。你会了解到你写的指针是作用在变量的地址还是变量的值,或指针本身的地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-1 17:23:09 | 显示全部楼层    本楼为最佳答案   
int a;   定义a是整型变量
&是取地址符 ,&a获得a变量的地址
变量a:有2个属性(一个是变量a,另一个是变量a所对应的地址)
地址的作用:变量a会在内存对应一个点,通过地址能唯一准确的找个这个点。(无论你程序有多复杂,有多少个变量,我都能通过这个地址在内存中准确的找到这个唯一的点)
地址的保存:这时就要用地址的变量来保存地址(变量总要先定一个类型, int*所定义的类型就是地址类型) int* p =&a;地址变量p保存了变量a的地址,也就是指针变量p保存了变量a的地址.
*p 就好理解了,先通过p找到地址,再通过*把地址所对应的变量取出来。 就是*P = a
第二个问题
main()与swap()函数的关系
main()是主程序,swap()是子程序,子程序一般不能改变主程序的内容。(函数得到一个返回值主程序接受下就行了)
如果子程序要改变主程序的变量,通过地址找到变量,把值换下就行了。


void swap(int *p1, int*p2)
{
    int t = *p1;
    *p1 = *p2;
    *p2 = t;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-30 04:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表