您的位置:首页 > 其它

p,&p,*p的区别

2015-07-28 10:34 99 查看
一、区别

int z=0;

int &x = z;//引用,x与z指向同一内存单元

int *y;

y = &x;//0x0012ff14 p本身所占内存单元的地址

cout <<x<<" "<<*y<<" "<<z<<endl;

下面是摘抄别人的一段测试程序。

void test(){

int a=8;

int *p=&a;

p=(int *)malloc(N*sizeof(int));

// printf( "%d/n ",*p);

//a. cout < <&p; //0x0012ff14 p本身所占内存单元的地址

//b. cout < <*p; //8 p所指向的内存单元的值

c. cout < <p; //0x000431c50 p所指向的内存单元的地址

}

从测试的结果很容易看出来,*P是一个指针变量,它存储的数据是地址,并且也只能存储地址,所以在给*P赋值时,请您确认等号右边的值是不是一个地址。如果不是,那么您的程序将会出现BUG,(或许您是一位优秀的汇编写手,那么请您处理好该指针变量)。

另外还要说明的是int *p=&a;等价于int *p ; p = &a;

应该注意的2点是:

1.给指针只能传地址,不能传值.否则要做强制类型转换.

2.在做类型转换和赋值时候,应该注意赋值的类型匹配.

指针与数组的区别:

很多初学者弄不清指针和数组到底有什么样的关系。我现在就告诉你:他们之间没有

任何关系!只是他们经常穿着相似的衣服来逗你玩罢了。

指针就是指针,指针变量在32 位系统下,永远占4 个byte,其值为某一个内存的地址。

指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到。

数组就是数组,其大小与元素的类型和个数有关。定义数组时必须指定其元素的类型

和个数。数组可以存任何类型的数据,但不能存函数。

既然它们之间没有任何关系,那为何很多人把数组和指针混淆呢?甚至很多人认为指

针和数组是一样的。这就与市面上的C 语言的书有关,几乎没有一本书把这个问题讲透彻,

讲明白了。

#include <stdio.h>

intmain()

{

int a[5]={1,2,3,4,5};

int *ptr1=(int *)(&a+1); //a数组是一个整体,sizeof(a)=20;&a表示数组的首地址,&a+1会相当于加20个字节长度。

int *ptr2=(int *)((int)a+1); //a强制转换为int型后,相当于整数加一,所以这只是相当于地址加了一个字节。再转换为地址存入ptr2

int *ptr3=(int *)(a+1); //这个是大家非常熟悉的了,数组a作为左值时相当于&a[0],它加一相当于加了一个数组类型的长度,即4字节(整形)。a不能作为右值。

printf("%x,%x,%x",ptr1[-1],*ptr2,ptr3);

printf("%x,%x,%x",ptr1,ptr2,ptr3);

return 0;

}

#include<iostream>

usingnamespace std;

int g =300;

void print(int p,int q)

{

cout<< p<< endl<< q<< endl;

}

voidset(int*&p,int* q)

{

p=&g;// p是引用类型,可以改变传进参数的指向

q=&g;// q不会

}

int main()

{

int a =10,
b=20;

int*pa=&a,*pb=&b;

print(a, b);

cout<< pa<< endl<< pb<< endl;

set(pa,
pb); // pa现在指向g,但pb还是指向b,这就是引用和非引用的差别

print(a, b);

print(*pa,*pb);

return0;

}

int
*&p是指针的引用,不会为p开辟空间,只是一个名字,此时相当直接对pa操作,后者开辟了个临时指针,得到pa的地址,根据指针指向地址修改pa所指向的值!两者效果是一样,但具体的实际过程有区别!

二、*&p表示什么意思

void main()
{
int *a;
int *&p=a;
int b=10;
p=&b;
}

int a=10;
int p=a;
这种情况,p与a是不同的变量,这里是将a的值赋给p
int &p=a;
即<span style="color: rgb(255, 0, 0);"> p是a 的别名</span>,p和a其实是同一个整形变量,两个占用同一块内存空间,如果有 p=15;那么a也是15,修改p与修改a是完全等价的

那么
int *a;
int * &p=a;
很容易理解,把 int * 看成一个类型,<span style="color: rgb(255, 0, 0);">a就是一个整型指针,p 是a的别名</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: