在指针中*是取内容,&是取地址
(在结构体中时:变量结构体用".",指针结构体用"->")
通常有两种的表示:
1. 通过指针向指向的地址内容赋值
*p=a; //将p指向的地址里赋a值
注意:若a和p定义的变量类型不一样时,需要用到强制转换才行.
当指针指向的地址内容是一个变量时,
实例如下:
int main()
{
int *p=0x12345678; //定义一个int型指针*p,p=0x12345678这个地址。
char a='0'; //定义一个char型变量b
*p=(int)a; //*p等于a(0x12345678这个地址的内容等于a变量的值)
}
当指针指向的地址内容是另一个指针指向的地址内容时,
实例如下:
int main()
{
int *p=0x12345678; //定义一个int型指针*p,p=0x12345678这个地址。
char b='0'; //定义一个char型变量b
char *a=&b; //定义一个char型指针*a,a=&b,表示a指针的地址等于b的地址。
*p=*(int *)a; //首先是先执行(int *)强制转换为int型指针,然后*p等于*a(0x12345678地址的内容等于'0'这个变量)
}
2. 指针指向其它的地址
p=&a; //将p的地址 指向a的地址
它和"int a=0,*p=&a;"一个意思,这里的*只是代表定义一个指针(不是指向地址的内容),然后指针p=&a;
实例如下:
int main()
{
int a=0,*p; //定义一个int型指针p,p等于0x12345678这个地址。
p=&a; //p等于a的地址,则*p=0
}
3.指针地址与数值相加
指针地址与数值相加和数值与数值相加不一样,
char型指针:0X3000+1=0X3001 (因为1个地址保存8位数据,而char是8位.)
short型指针:0X3000+1=0X3002 (16位)
int、long型指针:0X3000+1=0X3004 (32位)
long long型指针:0X3000+1=0X3008 (64位)
变量与变量相加,实例如下:
#include "stdio.h"
#define tag_next(t) ((int *)((unsigned long)(t) + 1))
int main()
{
int i=3,*t=&i;
printf(" %x,%d\n", t,*t);
t=tag_next(t); //t= *(t+1)
printf(" %x,%d\n", t,*t);
}
这里的tag_next(t): 将t地址强制转换为u32变量,与另一个变量1相加
代码输出如下:
也就是t=0X28ff18+1=0x28ff19
int型指针地址与变量相加,实例如下:
#include "stdio.h"
#define tag_next(t) ((int *)((unsigned int*)(t) + 1))
int main()
{
int i=3,*t=&i;
printf(" %x,%d\n", t,*t);
t=tag_next(t); //t=*((unsigned long *)t +1)
printf(" %x,%d\n", t,*t);
}
这里的tag_next(t): 将t地址强制转换为u32*指针,然后这个指针地址与另一个变量1相加
代码输出如下:
也就是t=0X28ff18+1=0x28ff18+4=0x28ff1c