学习了C语言之后,关于指针部分看了无数遍,有时候明明觉得自己看懂了,指针就是地址,但是总是在看代码时候糊里糊涂的搞不明白,最近又关于指针强化了一把。

大部分情况下对于程序中指针糊涂是因为不明白指针符“*”有两个作用:

第一,作为标识符,定义变量为指针,如int *p;//只是说明变量p是指针变量,而没有实际意义。

第二,作为运算符,像+,—,运算符一样,如cout<<*p;//输出指针变量p所指向的内容。

一般在程序中,第一次出现的指针符*,是作为标识符,申明指针变量,之后出现是作为运算符,但也不一定,主要还是看程序语境。

而“&”符号是一元运算符,取变量地址。

好了,关于指针我目前使用最多的是作为参数传递。由于自己研究图像处理,程序中往往要处理上千的图片,内存常常溢出,内存分配尤其重要,这时候我被迫学习了指针的使用。

面向对象编程函数传递往往是值传递,但是值传递的形参是实参的拷贝,如果此时我用值传递,上千张图片在内存中再拷贝一份可想而知,所以考虑用指针传递。

//指针传递

void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
cout<<*a<<‘ ’<<*b<<’\n’;
} int main(){
int x=1;
int y=2;
swap(&x,&y);
cout<<x<<‘ ’<<y<<’\n’; }
//输出2 1 , 2 1

  

上段程序中,实参传递的是x,y 的地址,形参定义a,b为指针变量,a,b内容为x,y地址的拷贝,程序中*a,*b是x,y地址所指向的内容,即为x,y。

所以程序中操作的也是x,y本身,此程序不需要重新在内存中开辟新的空间,之间操作实参本身。

另一种传递方式,引用传递,作用和指针传递一样

//引用传递:

void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
cout<<a<<’ ‘<<b<<’\n’;
} int main(){
int x=;
int y=;
swap(x,y);
cout<<x<<’ ‘<<y<<’\n’;
return ;
}

上段代码跟指针传递结果一样,均输出2 1 , 2 1

函数调用形式跟值传递一样,但是被调用函数的形参则引用x,y 的地址,函数中操作的也是x,y本身。

C中指针符*和取址符&的更多相关文章

  1. 大一C语言学习笔记(7)---指针篇--什么是指针?什么是指针变量?取地址符“&”的作用是什么?地址运算符“*”的作用是什么,怎么理解两者?

    "指针是C语言的灵魂"这句话一开始我没怎么明白,现在接触了指针,终于知道为什么这么说了,因为....难,真难:下面说一下我对这句话的见解: C语言拥有着其他语言所没有的特性---直 ...

  2. 【温故知新C/C++/opencv】取址符&||cv::groupRectangles||引用与值传递

    cv::groupRectangles void groupRectangles(vector<Rect>& rectList, int groupThreshold, doubl ...

  3. C语言中指针和取地址符&的关系

    一 概念定义: 严格说起来,应该这么讲:指针存的是地址,而&运算符是取变量的地址. 指针原理: 其实计算机中的内存就像一个个抽屉(一兆内存就相当于1百万个抽屉),每个抽屉都有一个编号,用于存放 ...

  4. php的foreach中使用取地址符,注意释放

    先来举个例子: <?php $array = array(1, 2, 3); foreach ($array as &$value) {} // unset($value); forea ...

  5. C++中 容易忽视的const 修饰符

    C++可以用const定义常量,也可以用#define定义常量,但是前者比后者有更多的有点: (1)const常量有数据类型,而宏常量没有数据类型.编译器可以对const进行类型安全检查,而后者只进行 ...

  6. 文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式

    本节主要内容: 1.面向对象中的成员 2.成员修饰符 3.特殊成员 4.异常处理 5.设计模式之单例模式 一.面向对象中的成员(类的成员) 类的成员总共可以分为3大类,每类中有不同的分支. 1.总述, ...

  7. NSIS:获取硬盘中容量最大的分区盘符

    原文 NSIS:获取硬盘中容量最大的分区盘符 我们在安装一些在线视频软件比如迅雷看看时,会发现他们的安装程序会自动判断当前系统中容量最大的分区,以便在其中创建数据缓冲下载的文件夹,这种功能如果实现呢, ...

  8. 12-01 Java Scanner类,Scanner类中的nextLine()产生的换行符问题

    分析理解:Scanner sc = new Scanner(System.in); package cn.itcast_01; /* * Scanner:用于接收键盘录入数据. * * 前面的时候: ...

  9. Python 中的属性访问与描述符

    在Python中,对于一个对象的属性访问,我们一般采用的是点(.)属性运算符进行操作.例如,有一个类实例对象foo,它有一个name属性,那便可以使用foo.name对此属性进行访问.一般而言,点(. ...

随机推荐

  1. Asp.net中GridView详解《转》

    ASP.NET服务器控件GridView 1         ASP.NET 服务器控件GridView使用 本教程不介绍服务器端控件的呈现,事件处理,状态等理论知识,只介绍服务器端控件的使用操作,如 ...

  2. Redis基础认识及常用命令使用(一)--转载

    Redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集 ...

  3. IDEA内置Git管理

    总结:     1.要想用git管理项目,先要将本地项目与git关联,才能进行commit.push.pull等操作:     2.将本地项目于git关联后,本地仓库的地址默认就是项目地址:     ...

  4. 【Java深入研究】1、object类

    一.概述Object类是所有Java类的祖先.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法. 参考英文:* Class {@code Object} is the ro ...

  5. 140 - The 12th Zhejiang Provincial Collegiate Programming Contest(浙江省赛2015)

      Ace of Aces Time Limit: 2 Seconds      Memory Limit: 65536 KB There is a mysterious organization c ...

  6. ThreadLocal终极源码剖析-一篇足矣!

    本文较深入的分析了ThreadLocal和InheritableThreadLocal,从4个方向去分析:源码注释.源码剖析.功能测试.应用场景. 一.ThreadLocal 我们使用ThreadLo ...

  7. 【Java入门提高篇】Day21 Java容器类详解(四)ArrayList源码分析

    今天要介绍的是List接口中最常用的实现类——ArrayList,本篇的源码分析基于JDK8,如果有不一致的地方,可先切换到JDK8后再进行操作. 本篇的内容主要包括这几块: 1.源码结构介绍 2.源 ...

  8. Nodejs 安装 on centos7

    本文演示如何在CentOS7上安装Nodejs. 1 准备工作 1.1 浏览器访问安装包下载地址: https://nodejs.org/dist/ 找到需要安装的版本,以8.11.3版本为例,地址为 ...

  9. Python鸢尾花分类实现

    #coding:utf-8 from sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_s ...

  10. python第三十天-类

    编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很 ...