本文中提供的代码只是便于理解指针,在实际应用中不建议使用
指针就是一个无符号整形变量
注意在c与c++中将一个指针赋值给一个int变量时要强制类型转换
例如:
int main()
{
char *p = new char[100] ;
memset(p ,0,sizeof(p));
strcpy(p,"this is a char pointe");
int a = (int)p ;
if (a == (int)p)
{
printf("a == (int)p\n");
}
if (p == (char*)a)
{
printf("p == (char*)a\n");
}
printf("p = %x,a= %x\n",p,a);
printf("p = %s, (char*)a = %s\n",p,(char*)a);
p = new char[100] ;
int b = (int)p ;
strcpy((char*)b,"this is a point b");
printf("p = %s,a = %s,b = %s\n",p,(char*)a,(char*)b);
p = (char*)a ;
printf("a = %s\n",p);
delete((char*)b); //释放第二次new出来的指针;
delete((char*)a);//释放第一次new出来的指针;
printf("delete ok\n");
//printf("p = %s",p);//输出一串乱码或段错误 ,p 被 delete掉了 指向的是一块野指针;
p = NULL ; //NULL 就是常量 0 ;
//delete(p); 错误 删除一个没有开辟的内存块;
a = 0x5678 ;
p = (char*)a ; //p指向了一块野指针;
}
在系统当中,任意一个常数都是一个野指针(寄存器的地址,程序中变量或常量的地址除外),特殊的 NULL (0)是空针。
为什么指针的大小为4个字节?
因为指针保存的是一块内存的地址,地址就是一个无符号的整数,所以为4个字节。
在c++中传递参数时为什么传递指针时值有可能不会被返回,传递引用时一定会被返回?
原因见代码:
int fun1(int* a)
{
*a = 1 ; //改变a所指的对象的值,并没有改变a的值;
printf("a = %d fun1\n",*a);
return 0 ;
}
int fun2(int *a)
{
int* p = new int ;
*p = 8 ;
a = p ; //改变了a的指向,及改变了a的值;
printf("a = %d fun2\n",*a);
return 0 ;
//指针p没有被释放;
}
int fun3(int* &a)
{
int* p = new int ;
*p = 8 ;
a = p ; //改变了a的指向,及改变了a的值;
printf("a = %d fun3\n",*a);
return 0 ;
}
int main()
{
int* a = new int ;
*a = 0 ;
fun1(a); // a的值改变,改变的是a所指对象的值,不是a的值;
printf("fun1 a = %d\n",*a);
fun2(a); //a的值不会改变,fun2中改变的是a的值而不是*a的值(相当于传递了一个变量);
printf("fun2 a = %d\n",*a);
int*p = a ;
fun3(a); //a的值改变,fun3接收的为引用改变的是a的值而不是*a的值;
printf("fun3 a = %d p = %d\n",*a,*p);
delete a ;
delete p ;
}