指针

‘ * ’的意义

void main()
{
    int a=10, b=20;
    int *p=NULL;
}

c = a * b;//乘法
int * p; //类型 * 标识符==>指针

*声明,与变量名结合,不是与类型结合

(int*) p,s;//编译器认为(类型名 *),识别为强转

*p ;//指向

void main()
{
    int a;
    int *p;
    p=&a;// =>int *p=&a;p指向a
}//* 声明

int *x,y,z;//=>x为指针,y和z为整型

typedef int *PINT;

void main()
{
    PINT x,y;//=>x和y都为指针
}

区别于

#define SINT int*

void main()
{
    SINT x,y;//=>x为指针,y为整型
}

int **a;//二级指针
int ***a;//三级指针

int a=10,b=20;
int *p=&a;
int **s=&p;

这里写图片描述
a [ 10 ]
地址 &a=0x0012ff28

b [ 20 ]
地址 &b=0x0012ff1c

p [0x0012ff28] / / / / / /p=0x0012ff28
地址 &p=0x0012ff10 / *p=a=>10

s [0x0012ff10]
地址 &s=0012ff04

s=0x0012ff10
*s=p=>0x0012ff28
**s=a=>10
*&s= s=*&p=&a=p

1.指针类型决定指针+1的能力

void main()
{
    int ar[10]={1,2,3,4,5,};
    int *p=&a[0];
    for(int i=0;i<10;i++)
    {
        printf("%x=>%d\n",p,*p);
        p=p+1;//p=p+sizeof(int)*1
    }
}

2.指针类型决定对内存的解释能力

void main()
{
    int a=0x12345678;
    int *ip=&a;
    char *cp=&a;//(错误)==>char *cp=(char*)&a;
}

指针有两个值

  1. 自身的值 p
  2. 指向的值 *p

例:

int a=10,b=20;
int *p1=&a;
int *p2=&b;
if(p1>p2)//a的地址和b的地址的比较
{
}
if(*p1>*p2)//a和b比较
{
}
if(p1>*p2);//编译错误,类型不同

int *p=&a;
int x=&a;//错误,x要的是整型值,而&a是一个地址

int *p=&0x0012ff28;//编译不通过,常量不能取地址
==>int * p=(int*)0x0012ff28;//正确

int *p=0x0012ff28;//编译不通过,系统把0x00112ff28识别为一个整型,而需要一个指针
int x=0x0012ff28;//编译通过

只有基本数据类型之间可以隐式转换
而派生类型(指针,数组,结构体)和基本数据类型之间转换是必须要强转,不能隐式类型准换.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值