admin 管理员组

文章数量: 887044

p,p,*p的区别

一、区别

 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; 
即 p是a 的别名,p和a其实是同一个整形变量,两个占用同一块内存空间,如果有 p=15;那么a也是15,修改p与修改a是完全等价的那么
int *a;
int * &p=a; 
很容易理解,把 int * 看成一个类型,a就是一个整型指针,p 是a的别名

本文标签: P *p的区别