一、区别
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>