具体的*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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值