C语言指针,的声明、&取地址、※解引用、设置值、偏移、自增 的问题举例代码:int※a,d[]={1,2,4,8};char*f,e[]=“Hellow…”;a=&b; P1=※a; ※a=4; P1=※(++a);f=&e[7];
(备注:※代表*,转义问题,没显示)
可以拷贝代码到Keil中调试运行看变量(直接拖动变量到监视器1中观察即可,右键监视器变量,可选择是否显示HEX的0x十六进制和十进制)
#include <stdio.h>
#include <REG52.H>
void main (void) {
//int p1=0;
int* a,b,c;
int d[]={1,2,4,8,16};//注意这里是Shift+[]={}花括号包数组
char e[]="Hellow World!";//1字节的类型,字符串就可以直接双引号
char*f;
while(1)
{
P1=0;
P1=0xff;
P1=0x0f;
a=&b;
b=20;
P1=*a;
a=&c;
c=10;
P1=*a;
a=&d;
P1=a;//没有解引用,是指针地址0x0F
P1=*a;//1,解引用了,所以是读指针指向的值1
P1=a[2];//4,0x0F+(2*int2字节)=0x13,P1=*a[2];P1=*(a[2]);//都编译错误
P1=a[0];//1,I:0x0F
P1=a[1];//2,I:0x11
P1=a[2];//4,I:0x13<
P1=a[3];//8,I:0x15
P1=a[4];//16,I:0x17
a++;//0x11
P1=*a;//2
P1=*a++;//2
P1=*a;//4
P1=++*a;//5,等效为*a=++*a;P1=*a;//4+1=5,解引用值自增后,给P1赋值
P1=*a;//5
*a=4;//给当前指针赋值4
P1=*(a++);//4,等效为P1=*a;a++;I:0x13+2=0x15后8
P1=*(++a);//16,等效为++a;P1=*a;
P1=*a;//16
P1=*(++a);//2,已经溢出不是固定值了,a指向了0x17+2=0x19
//总结:*解引用优先于自增,加括号()就优先自增,看++指针++前后了
f=&e;//72'H'
P1=*f;//72'H'
P1=f[0];//72'H'
P1=f[1];//101'e'
P1=f[2];//108'l'
P1=f[3];//108'l'
P1=f[4];//111'o'
P1=f[5];//119'w'
P1=f[5];//32' '
P1=*(++f);//101'e'
P1=*(++f);//108'l'
P1=*(++f);//108'l'
P1=*(++f);//111'o'
P1=*(++f);//119'w'
//给字符串截取后半段,偏移[7]"World!"位置
f=&e[7];//87'W'
P1=*f;//87'W'
P1=f[0];//87'W' //[0]下标不再是e[]字符串的首地址了,已经偏移了
P1=f[1];//111'o'
P1=f[2];//114'r'
P1=f[3];//108'l'
P1=f[4];//100'd'
P1=f[5];//33'!'
P1=f[6];//0溢出,不报错
P1=f[7];//0溢出
//指针自增
P1=*(++f);//111'o'
P1=*(++f);//114'r'
P1=*(++f);//108'l'
P1=*(++f);//100'd'
P1=*(++f);//33'!'
P1=*(++f);//0溢出,不报错
f=&e[0];
P1=*f++;//72'H'
P1=*f++;//101'e'
P1=*f++;//108'l'
P1=*f++;//108'l'
P1=*f++;//111'o'
f=&e[0];
P1=*(f++);//72'H'
P1=*(f++);//101'e'
P1=*(f++);//108'l'
P1=*(f++);//108'l'
P1=*(f++);//111'o'
}
2024.7.8 JianPF
}
(问AI,给了一个灵动交流式的回答,以前的愿望好像实现了一半了,另一半靠你了)