‘ * ’的意义
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;
}
指针有两个值
- 自身的值 p
- 指向的值 *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;//编译通过
只有基本数据类型之间可以隐式转换
而派生类型(指针,数组,结构体)和基本数据类型之间转换是必须要强转,不能隐式类型准换.