指针使用注意事项

题:即输入的两个整数按大小顺序输出。今用函数处理,而且用指针类型的数据作函数参数。

swap(int *p1,int *p2){
    int temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}
main(){
    int a,b;
    int *pointer_1,*pointer_2;
    scanf("%d,%d",&a,&b);
    pointer_1=&a;pointer_2=&b;
    if(a<b) swap(pointer_1,pointer_2);
    printf("\n%d,%d\n",a,b);
}对程序的说明:1) swap是用户定义的函数,它的作用是交换两个变量(a和b)的值。swap函数的形参p1、p2是指针变量。程序运行时,先执行main函数,输入a和b的值。然后将a和b的地址分别赋给指针变量pointer_1和pointer_2,使pointer_1指向a,pointer_2指向b。


2) 接着执行if语句,由于a<b,因此执行swap函数。注意实参pointer_1和pointer_2是指针变量,在函数调用时,将实参变量的值传递给形参变量。采取的依然是“值传递”方式。因此虚实结合后形参p1的值为&a,p2的值为&b。这时p1和pointer_1指向变量a,p2和pointer_2指向变量b。


3) 接着执行执行swap函数的函数体使*p1和*p2的值互换,也就是使a和b的值互换。函数调用结束后,p1和p2不复存在(已释放)。

4) 最后在main函数中输出的a和b的值是已经过交换的值。请注意交换*p1和*p2的值是如何实现的。请找出下列程序段的错误:
swap(int *p1,int *p2){
    int *temp;
    *temp=*p1;      /*此语句有问题*/
    *p1=*p2;
    *p2=temp;
}注意:temp指针定义了,当时没有初始化值,即没有指向的地址。此时*p1--相当于一个int类型的值,直接赋值给temp指针,肯定报错,即temp指针没有接收*p1的地址,但是此时假使*p1指针初始化成功,那么temp=p1,这样可以理解成,temp指针指向了p1指针所指向的地址。
时间: 2024-10-11 23:11:44

指针使用注意事项的相关文章

delete 类对象指针的注意事项]

http://blog.csdn.net/infoworld/article/details/45560219 场景:1. C++类有构造和析构函数,析构函数是在类对象被delete时(或局部变量自动销毁时)调用来释放资源. 2. C++类对象指针很多情况下需要赋值给void*通用指针来达到传输对象的目的,但是往往这种void*指针就是造成内存泄漏或程序错误的根源, 这就是为什么C++存在泛型的目的,它也是为了在编译时刻消除这种对象不确定性,避免delete或使用时的错误. 3. delete

TODO:Golang指针使用注意事项

先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. 在看例子3: 输出: map[a:aa b:bb] map[b:world a:hello] 发现什么了,TestMap前面没有加*,没有用指针,怎么也会改变值呢?因为map提供键值功能,用起来像指针引用的类型.类似这种功能的类型还有,数组切片,channel,interface.Go语言包这种指针引用类型,有兴趣可以去阅读一下源码,变量

[C/C++]_[中级]_[delete 类对象指针的注意事项]

场景:1. C++类有构造和析构函数,析构函数是在类对象被delete时(或局部变量自动销毁时)调用来释放资源. 2. C++类对象指针很多情况下需要赋值给void*通用指针来达到传输对象的目的,但是往往这种void*指针就是造成内存泄漏或程序错误的根源, 这就是为什么C++存在泛型的目的,它也是为了在编译时刻消除这种对象不确定性,避免delete或使用时的错误. 好了,看代码,以下代码有什么问题? // test_class.cpp : 定义控制台应用程序的入口点. // #include "

指针初级(定义, 初始化, 重指向, 注意事项)

大家好, 今天我们来学习C语言中的指针. 可能大家都听过这么一句话: C语言中其它我学得都很好, 就是指针这一块学得不是太明白, 那么你不如告诉我你没有学过C语言. 这么一句话突出了指针这个概念在C语言当中的重要性. 还有的同学说, 我听别从说C语言当中的指针好难, 特别难理解, 很难学会.那么我告诉大家的是, 指针没有什么难的地方, 那只是你们潜意识这么认为的, 通过今天这节课的学习, 我相信大家都能学会指针, 并且会用指针. 好, 下面开始指针的学习. 在学指针之前, 我先给大家普及一下,

黑马程序员——C语言——指针

一. 指针的定义.赋值 1.定义格式:变量类型 *变量名; char   *p(定义了一个指针变量p,且指针p只能指向char类型数据) 2.指针的特点,指针变量只能存储地址 3.指针的作用:能够根据一个地址值,访问对应的存储空间 4.指针的存储:任何指针都占8个字节的存储空间 5.指针的赋值: ①  先定义后赋值 1 int a = 10; 2 int *p; 3 p = &a; ②  定义的同时赋值 1 int a = 10; 2 int *p = &a; ③ 易错点 1 %p输出指针

C语言_指针

指针:指针就是变量的地址 地址:一块内存的唯一标识 int a; &    :取地址符号 &a  : a的地址 a = 3:  //直接存取 int *p;  //未初始化的指针称为野指针 p   //指针变量名 *    //指向 指针变量只能存储地址(指针) p = &a: //p指向了变量a *p             //*p代表p指向的变量 *p = 5://间接存取(通过指针变量p间接的改写了变量a的值) //使用指针的注意事项: 1.定义指针时,初始化为空(NULL

扩展方法用法及其原理和注意事项

前言 一直以来尤其像C#一些常见的语法,本人更愿意去探讨其内部实现的原理,为什么要这么做呢?只是为了当我真正在开发中运用语法的时候不会因为犯常识性错误或者说因为一些注意事项未曾注意到而耽误一些无谓的时间,同时也能理解的更深入而不是仅仅停留在表面(或许理解也不是太透).(当然本人能力有限,太高深的东西必定是研究不明白了,也只有这能力了). 概念 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例

c/c++ 智能指针 shared_ptr 使用

智能指针 shared_ptr 使用 上一篇智能指针是啥玩意,介绍了什么是智能指针. 这一篇简单说说如何使用智能指针. 一,智能指针分3类:今天只唠唠shared_ptr shared_ptr unique_ptr weak_ptr 二,下表是shared_ptr和unique_ptr都支持的操作 操作 功能描述 shared_ptr<T> sp 空智能指针,可以指向类型为T的对象 unique_ptr<T> up 空智能指针,可以指向类型为T的对象 p 将p用作一个条件判断,如果

C++_智能指针模板类

智能指针是行为类似于指针的类对象,但这种对象还有其他功能. 本节介绍三个可帮助管理动态内存分配的智能指针模板(auto_ptr.unique_ptr和shared_ptr). void remodel(std:string & str) { std::string * ps = new std::string(str); ... str = ps; return; } 这段代码有缺陷,每当调用时,该函数都分配堆中的内存,但从不回收,从而导致内存泄漏: 但是有解决之道——在return语句前添加下