具体的*P的意思

今天在看程序的时候就发现一个问题,就是我的另外的一篇文章里面的一个程序,就是那个发生段错误的程序里面的。
里面的一句就是给head初始化:struct film *head=NULL,而下面的对head的引用就是这么用的:if(head=NULL),我就想了初始化应该是把整个值(*head)都给初始化了啊,怎么是head啊,网上找一下就是了,其实很多的,牛人真的是多!
下面是我找到的人家的,用的是c++实现,其实很简单,先看看吧。
int *p = NULL; char *p = NULL; 的问题

问题:
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

你可能感兴趣的:(C++,c,C#,D语言)