Fork me on GitHub
C/C++中*、&用法
A: 
函数声明:int find(int* a); 
函数调用:int b = 1; 
          int n = find(&b); 
这样调用时,实际上是进行了:int* a = &b,创建了一个新的指向b的整型指针a作为find函数范围内的局部变量。 

B: 
函数声明:int find(int& a); 
函数调用:int b = 1; 
          int n = find(b); 
这样调用时,实际上是进行了:int& a = b,给变量b起了个别名a,也就是说a和b实际上代表的是同一个变量,调用期间没有创建任何新的变量。 

C: 
函数声明:int find(int a); 
函数调用:int b = 1; 
          int n = find(b); 
这样调用时,实际上是进行了:int a = b,也就是普通的变量赋值操作,调用期间创建了在find函数范围内的局部变量a,它的值与b相同 

D:&在用于计算时就是取变量地址,如int* a = &b,就是将整型变量b的地址取出,赋值给整型指针a,a中的内容就是b的地址,所以a指向b 

E:*在用于计算时,就是取指针所指向的地址中的值,如int b = *a,就是将整型指针a指向的地址中存放的内容赋值给整型变量b 

C语言中,&符号大家一定很熟悉吧,它除了可以作为按位运算“与”之外还有更常用的功能——取变量地址。

先看下面几个简单的例子:

 #include <stdio.h>

int main(void) 

    int a = 0;

    int *p = &a;

    printf("The value is: %d\n", *p);

    return 0; 
}

上面代码中,指针p指向变量a的地址。在C/C++中,每个变量都有其相应的地址,通过在变量标识符前加&符号即可获得变量的地址。

那么我们这么写可以吗?int *p = &0x01000;

这显然不行。因为对于一个数值常量,它是没有地址的。而变量之所以有地址就是因为要有一个存储单元对变量进行标识(当然,变量也可以直接映射到某个寄存器)。

我们再看下面的代码:

 

#include "stdio.h"

int main(void)  
{  
    int a = 0; // &a = 0x0012ff60  
    int *p = &*(int*)0x0012ff60;  
    printf("The value is: %d\n", *p);  
    return 0;  
}

 上面代码又是怎么回事呢?

先前已经调查过变量a的地址——0x0012ff60,那么这里的指针p实际上也是指向变量a的地址。

首先,将0x0012ff60作为int*,这时它与&a是等价的。

然后*(int*)0x0012ff60表示取变量a的内容。

最后,&*(int*)0x0012ff60表示再脱去*(int*)0x0012ff60的解引用,相当于又变为(int*)&a。

因此,这里的&与第一个例子中的&是不同的语义。这里的&不是取地址,因为一个*(int*)0x0012ff60不是变量,它是没有地址的。每一个变量标识符在编译期间,编译器会为它们创建一个符号表,其中存放着变量标识符相应的各种属性,如类型、地址标识等。地址标识在连接后即可确定逻辑地址值。简而言之,&作为取地址操作,当且仅当&后面跟着的是变量或函数标识符。所以这里的&表示脱去解引用。

由此我们可以得出:&作为取地址操作时,其行为结果是在编译时就被确定的;而*,解引用操作(或取内容)操作,其行为结果只能在运行时才可被确定。

 

再看下面的例子,加深印象:

 

#include "stdio.h"


int main(void) 

    int a = 0;

    int *p = &*&*&a;

    printf("The value is: %d\n", *p);

    return 0; 
}

在C++中,&还可以表示引用,这个就不多说了。

#include "iostream" 
using namespace std;


int main(void) 

    int a = 0;

    int &r = a;

    cout << "The value is: " << r << endl;

    return 0; 
}

本文来自CSDN博客,出处:http://blog.csdn.net/zenny_chen/archive/2008/06/04/2512056.aspx

 

数据结构

 
摘要: 35,15,+,80,70,-,*,20,///后缀表达方式(((35+15)*(80-70))/20)=25 //中缀表达方式 /,*,+,35,15,-,80,70, 20 //前缀表达方式 人们习惯的运算方式是中缀表达式。而碰到前缀,后缀方式。。迷茫其实仅仅是一种表达式子的方式而已(不被你习惯的方式)一个中缀式到其他式子的转换方法~~这里我给出一个中缀表达式~a+b*c-(d+e)第一步:按...阅读全文
posted @ 2010-02-22 09:55 岁月流年 阅读(710) | 评论 (1) 编辑
 
摘要: (1)C++ 不允许在一个构造函数中调用另外一个构造函数(称为委派构造函数调用),而 C# 则允许。例如:  C++:  struct Point {  public:  int X, Y;  Point(int x, int y);  Point(Point pt) : Point(pt.X, pt.Y) { } // 错误,C++ 不允许  };   C#:  struct Point {  ...阅读全文
posted @ 2009-12-04 22:46 岁月流年 阅读(58) | 评论 (0) 编辑
 
摘要: A: 函数声明:int find(int* a); 函数调用:int b = 1; int n = find(&b); 这样调用时,实际上是进行了:int* a = &b,创建了一个新的指向b的整型指针a作为find函数范围内的局部变量。 B: 函数声明:int find(int& a); 函数调用:int b = 1; int n = find(b); 这样调用时,实际上...阅读全文
posted @ 2009-09-24 14:27 岁月流年 阅读(1133) | 评论 (0) 编辑
 
摘要: printf("A\n"); cout<<"B\n"; printf("C\n"); the ouputis : A C Bnot: A B Cwhy? answer: 1. you shouldn't mix "printf()" and "cout" in the same program because C stdio and C++ iostre...阅读全文
posted @ 2009-09-22 23:52 岁月流年 阅读(209) | 评论 (0) 编辑
 
摘要: malloc用法需要包含头文件:#include 'stdlib.h'函数声明(函数原型):void *malloc(int size);说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。从函数声明上可以看出。malloc 和 new 至少有两个不同: n...阅读全文
posted @ 2009-09-19 23:21 岁月流年 阅读(1612) | 评论 (0) 编辑
分类: 数据结构
posted on 2012-12-20 09:38  HackerVirus  阅读(278)  评论(0)    收藏  举报