- 浏览: 514602 次
- 性别:
- 来自: 惠州
文章分类
- 全部博客 (255)
- ant (1)
- springMVC (2)
- ajax (4)
- oracle (12)
- SSH (13)
- struts1 (2)
- Hibernate (14)
- spring (5)
- jstl (1)
- 连接池 (1)
- acegi (4)
- java (17)
- jquery (11)
- div+css (4)
- drupal (1)
- php (8)
- freemaker调模板生成静态页面 (1)
- xml (1)
- json (2)
- javascript (9)
- 正则表达式 (4)
- Ext (8)
- jdbc (1)
- sql server (2)
- perl (5)
- db4o (1)
- webservice (4)
- flex (13)
- it资讯 (1)
- joomla (0)
- 设计模式 (1)
- struts2 (4)
- s2sh (8)
- linux (3)
- ejb (2)
- android旅途 (24)
- android (36)
- C/C++ (16)
- mysql (1)
最新评论
-
fengyuxing168:
IBelyService bs = IBelyService. ...
为 Android 添加 Java 层服务也就是添加自定义的aidl服务到serviceManager 通过ServiceManager.getService取 -
dengzhangtao:
"由于ActivityManagerService是 ...
binder理解 -
yzyspy:
ActivityManagerService:startHom ...
Android的Launcher成为系统中第一个启动的,也是唯一的 -
Matchstick:
使用SELECT DISTINCT alias FROM Po ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题 -
dlheart:
没看懂你什么意思啊,我遇到的问题是一对多,设了fetch = ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题
今天看了两个小时 <<21 天学通 C++>> 把 C++ 中的指针、引用、传值问题弄清楚了
记住引用理解成别名
形参 出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。 形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元
实参 出现在主调函数中,进入被调函数后,实参变量也不能使用。参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。
1. 指针
声明指针
// 声明一个空指针 p
int *p = 0;
int pTmp; = 50;
int *p = & pTmp; <==> int *p ;
*p = & pTmp;
其中 p 里面存放的是 pTmp 的地址,
& 取地址符号
*p = & pTmp 只有在指针初始化时这样用,其实这种写法容易引起歧义;
此时:
p 中存放的是 pTmp 的地址;
*p 指的是指存储在指针的内存地址中的值 也就是 pTmp 的值;
&p 取指针本身的地址
所以:
cout<<*p // output : 50 ;
cout<<p // output : 0x22ff56 是 pTmp 变量所在的地址值;
cout<<&pTmp // output : 0x22ff56 是 pTmp 变量所在的地址值;
cout<<&p // output : 0x32fe88 是 p 本身的地址值;
p 指向变量,对 p 重新赋值就会改变 p 所指向变量的值,同样对 p 指向的变量重新赋值也会改变 *p 的值。
注意:
如果是char数组或者int数组时
定义方法:
char *p1 = "name"; <==> char s[ ] = "name"; char *p1; p1 = s;
printf("%s
\n",p1
);//这里是 p1
output: name
printf("%c\n",*p1);//output: n
int b[3] = {15,19,20};
int *i; <==> int *i = {15,19,20};
i = b;
printf("%d \n",*i
);//这里是 *i
output:15
ps:指针赋值问题
char * p1 ="name";
char *p2;
p2 = p1 ;//正确
while(*p2++ = *p1++) ;//错误
因为p1++每执行一次,指针就会后移一位,到末尾时指向"\0",故执行完后p2 为NULL
指针控制循环问题
当为int型数组时 ,不能用指针来作为循环条件
int arr[20];
int *ptr = arr;
int i;
for(i=0;i<20;i++)
{
ptr++; //指针加1
(*ptr)++;//指针指向内容加1
}
当为char型数组时
char *p="abc";
while(*p) // 当*p为‘/0’时终止
{
printf("%d\n",*p);
p++;
}
2. 引用
引用实际是其他变量的别名,对应用的操作就是对其引用的变量的操作
int pTmp1 = 20;
int pTmp2 = 22;
int &p = pTmp1; // 初始化的方式
引用重新赋值问题,会改变其引用的变量的值
p = pTmp2;
则:
cout<< p // output : 22 ;
cout<< pTmp1 // output : 22 ;
3 传参
i. 值传递:处理的是实参的拷贝,不会对实参产生影响。
代码 1 :
#include <iostream>
using namespace std;
void swap(int x,int y);
int main()
{
int x = 5,y = 10;
cout<<"main:before swap x = "<<x<<" y = "<<y<<"\n";//output: x=5,y=10
swap(x,y);
cout<<"main:after swap x = "<<x<<" y = "<<y<<"\n";//output: x=5,y=10
//return 0;
}
void swap(int x,int y)
{
int tmp;
cout<<"swap:before swap x = "<<x<<" y = "<<y<<"\n"; //output: x=5,y=10
tmp = x;
x = y;
y = tmp;
cout<<"swap:after swap x = "<<x<<" y = "<<y<<"\n";//output: x=10,y=5
}
注意:#define swap(a,b) a=a+b;b=a-b;a=a-b; 这种形式就会影响实参
ii. 指针通过引用传参:
代码 2
#include <iostream>
using namespace std;
void swap(int *x,int *y);
int main()
{
int x = 5,y = 10;
cout<<"main:before swap x = "<<x<<" y = "<<y<<"\n";//output: x=5,y=10
swap(&x,&y); // xy 的地址被做为参数传递给 swap
cout<<"main:after swap x = "<<x<<" y = "<<y<<"\n";//output: x=10,y=5
//return 0;
}
void swap(int *x,int *y ) // int *x = &x ,int *y = &y
{
int tmp;
cout<<"swap:before swap x = "<<*x<<" y = "<<*y<<"\n"; //output: x=5,y=10
tmp = *x;
*x = *y;
*y = tmp;
cout<<"swap:after swap x = "<<*x<<" y = "<<*y<<"\n";//output: x=10,y=5
}
iii. 引用通过引用传参
代码 2
#include <iostream>
using namespace std;
void swap(int &x,int &y);
int main()
{
int x = 5,y = 10;
cout<<"main:before swap x = "<<x<<" y = "<<y<<"\n";//output: x=5,y=10
swap(x,y); // 变量 x y 被做为参数传递给 swap
cout<<"main:after swap x = "<<x<<" y = "<<y<<"\n";//output: x=10,y=5
//return 0;
}
void swap(int &rx,int &ry ) // int &x = x ,int &y = y 这里 rx 和 ry 是 x
y 的别名
{
int tmp;
cout<<"swap:before swap x = "<<*rx<<" y = "<<*ry<<"\n"; //output: x=5,y=10
tmp = rx;
rx = ry;
ry = tmp;
cout<<"swap:after swap x = "<<rx<<" y = "<<ry<<"\n";//output: x=10,y=5
}
引用和指针使用原则: 一段代码: 1
#include
<
iostream
>
思考:在freePtr1和freePtr2 的比较中,你能发现它们的不同点吗? 二、对代码进行解释: #include <iostream> using namespace std; void freePtr1(int* p1) { //未释放内存前 -> p1 Address : 0012FDDC
p1 value :
003429B8,在这里,p1它也是一个变量,既然是一个变量,那么它将会以值的传递,把外部变量p1传到栈内,在栈内产生一个地
址:0012FDDC,当然,它的值不会变仍然是指向堆地址:003429B8 。 delete p1; //系统回收p1值的地址003429B8处的内存。 p1 = NULL;//对p1赋以NULL值即:00000000,注意:p1本身的地址并没有变,变的是p1的值。 //释放内存后 -> p1 Address : 0012FDDC p1 value : 00000000,出栈后,p1由于是一个临时对象,出栈后它会自动被视为无效。 } void freePtr2(int*& p2) { //未释放内存前 -> p2 Address : 0012FEC8
p2 value :
003429B8,p2是一个指针的引用,即引用指向指针,记住引用的特点:对引用的对象直接操作。所以它的地址和值与栈外的main()函数中,p2的
值是同一个。 delete p2; //对p2所引用的指针进行释放内存,即:系统回收main()函数中 p2的值 003429B8 地址处的内存。 p2 = NULL;//对main()函数中p2的指针赋以NULL值。 //释放内存后 -> p2 Address : 0012FEC8 p2 value : 00000000,由于操作的对象都是main()函数中的p2,所以它将应用到原变量中。 } void main() { int *p1 = new int; //释放内存前-> p1 Address : 0012FED4 p1 value : 003429B8 freePtr1(p1); //释放内存后-> p1 Address : 0012FED4 p1 value : 003429B8 int *p2 = new int; //释放内存前-> p2 Address : 0012FEC8 p2 value : 003429B8 freePtr2(p2); //释放内存后-> p2 Address : 0012FEC8 p2 value : 00000000 system("pause"); } void main() int *a2; }
int & *p; //不能建立指向引用的指针;int *a; int * & p=a; //正确,指针变量的引用
1.在可以用引用的情况下,不要用指针;
2.引用不允许重新赋值.,当使用一个变量指向不同的对象时,必须用指针;
3.引用不允许为空,当存在对象为空时,必须使用指针。
引用说明:
(1) double & rr=1; 等价与 double temp; temp=double(1); double & rr=temp;
(2) int *a; int * & p=a; int b=8; p=&b; //正确,指针变量的引用
void & a=3; //不正确,没有变量或对象的类型是void
int & ri=NULL; //不正确,有空指针,无空引用
(3) int & ra=int; //不正确,不能用类型来初始化
int *p=new int; int & r=*p; //正确
(4) 引用不同于一般变量,下面类型声明是非法的:
int &b[3]; //不能建立引用数组
int & *p; //不能建立指向引用的指针
int &&r; //不能建立引用的引用
(5) 当使用&运算符取一个引用的地址时,其值为所引用变量的地址,
2
3
using
namespace
std;
4
5
void
freePtr1(
int
*
p1)
6
7
{
8
9
delete p1;
10
11
p1
=
NULL;
12
13
}
14
15
void
freePtr2(
int
*&
p2)
16
17
{
18
19
delete p2;
20
21
p2
=
NULL;
22
23
}
24
25
26
27
void
main()
28
29
{
30
31
int
*
p1
=
new
int
;
32
33
*
p1
=
1
;
34
35
freePtr1(p1);
36
37
int
*
p2
=
new
int
;
38
39
*
p2
=
2
;
40
41
freePtr2(p2);
42
43
system(
"
pause
"
);
44
45
}
-----------------------------------------------
指针引用的经典用法:
#include <iostream>
using namespace std;
void all1(int **p)
{
int *pp = new int;
*p = pp;
}
void all2(int*& p)
{
int *pp = new int;
p = pp;
}
{
int *a1;
all1(&a1);
*a1 = 1;
cout<<*a1<<endl;
all2(a2);
*a2 = 2;
cout<<*a2<<endl;
发表评论
-
Linux内存点滴 用户进程内存空间 stack heap text data
2013-01-19 16:54 2957Linux内存点滴 用户进程内存空间 经常使用top ... -
Java JNI由浅入深(包括:Java和C++互传ArrayList泛型对象参数)
2011-10-28 15:09 4191Java JNI由浅入深(包括:Java和C++互传Array ... -
JNI编程(二) —— 让C++和Java相互调用(1)
2011-10-28 11:55 934自己在外面偷偷的算了下,又有将近两个月没更新过blog了。趁着 ... -
Android jni 常用方法备忘
2011-10-28 10:44 1201Android jni 常用方法备忘 ... -
c 线程同步
2011-10-28 09:23 894#include <pthread.h> #inc ... -
c++ 双线程协议解析 链表 sleep pthread_join g++编译
2011-10-25 11:37 1713主类 testlinklist.cpp #include &l ... -
undefined reference to 'pthread_create'问题解决
2011-10-25 10:19 1292undefined reference to 'pthread ... -
strlen与sizeof的区别
2011-10-12 14:20 844strlen与sizeof的区别 最后一个int a[3 ... -
C/C++语言数组作为参数传递
2011-09-28 17:08 1311#include <stdio.h> #inclu ... -
c/c++字符函数操作
2011-09-20 17:01 852// 取得Xml元素的值 // itemName:元 ... -
C++——指针,堆栈,引用,函数
2011-09-16 14:07 1370C++——指针,堆栈,引用,函数 ... -
STL中的"集合类"的定义使用
2011-09-16 09:23 1389STL 中的" 集合类" 的定义 ... -
c++链表操作
2011-09-15 19:22 920最后我学习一下如何在已有的链表上插入节点 我们要考虑四 ... -
c++面向对象的编程入门篇--类构造函数与析构函数
2011-09-15 16:14 979请注意,这一节内容是c++的重点,要特别注意! 我们先说一 ... -
C++实例集合类
2011-09-13 11:04 1288// 此程序通过数组来定义集合类,虽不如链表高级, ... -
C++操作符含义
2011-01-20 10:44 2124C++操作符含义 "->"是 ...
相关推荐
《21天学通C++第七版》是一本广受欢迎的C++编程教程,适合初学者和有一定基础的程序员作为进阶学习的资料。这本书以其系统性和实践性为特点,旨在帮助读者在短时间内掌握C++语言的核心概念和技术。第七版更新了C++11...
《21天学通C++第8版》是一本面向初学者的教程书籍,旨在帮助读者快速掌握C++的基础知识并逐步深入学习其高级特性。本书依照C++14标准编写,并展望了C++17标准即将引入的新功能。 首先,C++是一种静态类型、编译式、...
《21天学通C++(第8版)》是Siddhartha Rao所著的一本关于C++编程语言的学习指南,这本教材以简明易懂的方式向读者介绍C++的基本概念、语法以及面向对象编程的原则,并且根据C++14标准进行更新,同时展望了C++17标准...
21天学通C++(第五版) vs2008程序打包 深入浅出MFC 浙大教材C++达内 C++ 华为C++培训资料 visual c++_MFC 资源内容: visual c++_MFC 达内 C++ C++课件.ppt c++源码 .rar Core C++ Programming_new.ppt Core C++ ...
《21天学通C++》是一本针对初学者的经典教程,由Jesse Liberty、Siddhartha Rao和Bradley Jones合著,并由袁国忠和陈秋萍翻译成中文,旨在帮助读者在21天内掌握C++编程的基础知识。这本书的第六版更新了最新的C++...
构造函数,借助构造函数 解释 【赋值传值】,【引用传值】,【指针传值】
21天学通C++(第四版)21天学通C++(第四版)21天学通C++(第四版)21天学通C++(第四版)21天学通C++(第四版)21天学通C++(第四版)21天学通C++(第四版)21天学通C++(第四版)21天学通C++(第四版)21天学通C++...
《21天学通C++》是C++语言的入门教程,较为系统地介绍了C++语言的基础内容。《21天学通C++》包括6篇共21章的内容。其中,第一篇是C++数据表达篇,主要内容包括:C++入门、变量和数据类型、运算符和表达式以及程序...
21天学通C++ 第2版 出版社: 电子工业出版社; 第2版 (2011年2月1日) 丛书名: 21天学编程系列 平装: 418页 正文语种: 简体中文 《21天学通C++(第2版)》站在初学者的角度,较全面地介绍了C++的相关知识,较为系统...
### Java及C++中传值传递、引用传递和指针方式的理解 在程序设计语言中,函数调用时参数的传递方式对理解程序的行为至关重要。本文将深入探讨Java与C++这两种广泛使用的编程语言中参数传递的方式,包括值传递、引用...
指针和引用是C++语言中两种不同的概念,初学者容易把它们混淆一起。这两种概念都是地址的概念,但它们有很多不同的特点和应用场景。 相同点 1. 都是地址的概念;指针指向一块内存,它的内容是所指内存的地址;引用...
Character <br>Standard C Math <br>Standard C Time & Date <br>Standard C Memory <br>Other standard C functions <br>All C Functions<br>C++<br>C++ I/O <br>C++ Strings <br>C++ String Streams <br>...
《21天学通C++》是针对初学者及具有一定编程基础的程序员设计的教程,旨在帮助学习者在短时间内掌握C++编程语言。C++是一种广泛使用的高级编程语言,它在性能、功能和灵活性方面具有非常高的水准,被广泛应用于软件...
只需每天一小时便可具备开始使用C++进行编程所需的全部技能。通过阅读这本内容全面的教程,读者可快速掌握基本知识并学习更高级的特性和概念: 掌握有关C++和面向对象编程的基本知识; 学习一些C++高级特性; 学习...
《21天学通C++》是一套全面且深入的C++学习教程,旨在帮助初学者在短短21天内掌握C++编程的基础知识。本教程分为21个章节,内容涵盖C++语言的核心概念、语法和编程技巧,旨在使学习者能够快速上手并深入理解C++编程...
《21天学通C++》是一套针对初学者精心设计的学习资料,旨在帮助编程新手在短时间内掌握C++这门强大的编程语言。C++是一种通用的、面向对象的编程语言,由Bjarne Stroustrup在C语言的基础上发展而来,具有高效、灵活...
C++ 与C#之间的指针参数传递,实现无限量数据的传递,轻松无压力,方便在C++里面获取或者从C#传递数据到C++的动态库调用内。