问题:
void main()
{
int *p = NULL;
cout << p << endl;
cout << &p << endl;
}
输出结果为:
0x00000000
0x0012FF7C
void main()
{
char *p = NULL;
cout << p << endl;
cout << &p << endl;
}
输出:
报错!中断!
原因:
cout << p << endl;
对于:
int *p;
//cout << p; 输出的是p指针所指向内存单元的地址(当为int *p = NULL;时,p值为0)
而对于类型为:
char *p;
// cout << p; 输出的是一个字符串,并不是p指针所指向内存单元的地址, 当为char *p = NULL;时,p值为0在c语言下面两者是一样的,c++下面二者输出p的含义不一样。
如何获得 char *p = "TEST ";中字符串“TEST”的地址呢? &p为指针在堆栈中的地址,cout << p;又不能输出 "TEST "的地址,
方法:
cout << (int)p;
再看一个例子:
我自己编写的一个程序:
#include <stdio.h>
int main()
{
int *p=NULL;
printf("%d,%d/n",p,&p);
getchar();
}
这个输出是这样的:0,2293620,前面的是指针p的值,就是地址,后面的是存放p=0这个值的的地址。
一般的数据类型包括struct在内,如果直接赋值*head=NULL那么就是给head赋值,注意了head是值,而不是(*head)的值。而这样的初始化是赋初值,也是地址初始化吧。
记住一点,永远不要给没有初始化的指针赋值,指针的创建的时候赋值,使用的时候直接赋值的结果是很恐怖的,再看一个程序:
#include <stdio.h>
int main()
{
int a=55;
int *p=a;
printf("%d,%d/n",(*p),p);
getchar();
}
根本就没有办法调试,会提示信息,5 C:/code/1.c [Warning] initialization makes pointer from integer without a cast ,但是可以通过调试,运行一下就是错误的,这就对了,(*p)这种引用根本就是不对的,再看一个程序:
#include <stdio.h>
int main()
{
int a=55;
int *p=&a;
//int p=&a;
printf("%d/n",p);
int *q=55;
printf("%d/n",q);
getchar();
}
也是不可以的错误的原因跟上面一样,不可以给指针直接附值,但是可以附地址,比如int *q=p;程序更改一下:
#include <stdio.h>
int main()
{
int a=55;
int *p=&a;
printf("%d/n",p);
int *q=p;
// printf("%s/n",q);
printf("%d/n",q);
getchar();
}
就可以了,结果是:2293620,55从这里可以晓得,对于指针的引用就是p(q)而不是(*p)。
很直接很简单的总结一点就是指针的地址在不带星号的变量里面,带了星号的是值,如下结论:
1:可以在定义的时候:int *p=55,这个是赋初始值?这个是不对的,给指针赋值案下面2说的进行,也可以按照上面的给a的地址&a,可以用常量的地址不啊?不行的,比如&(55),我的理解是常量没有地址;
2:没有初始化就这样,假设有一个数组,就引用数组地址,或者malloc分配地址。
3:对char *p=NULL可以用,但是引用p不出问题,引用*p就出问题那是因为在给p给定了0地址,却没有给值,自然会段错误,可以直接附一个确定的字符串,char *p=“adfdf”;使用*p得到的是a字符,这个在一般书的比较数组和指针的部分都有讲,而printf("%s/n",p);得到的是字符串,printf("%d/n",p);得到的是头地址。
4:对struct film *P=NULL;就是p=NULL,不是(*p)=NULL