白鸟故迟留 发表于 2021-5-5 16:35:35

刚学指针的几个问题

各位大佬可以来解答一下吗?问题写在注释了。萌新真不懂了。
#include<stdio.h>
int main ()
{
   char a='F';
   int f=123;
   
   char *pa = &a;
   int *pb =&f;
   
   printf("%c %d\n",*pa,*pb);// 加*,打印所存值
   
   *pa='C';//这里为什么要加*???
   *pb+=1;//还有这里
   
   printf("%c %d\n",*pa,*pb);//加*,打印所存值
   printf("%p\n%p\n",pa,pb);//不加*,打印地址
   printf("%p\n%p\n",'C',124);//为什么和上面打印的地址不一样 ? ??
   
   return 0;
/*这是运行结果:
F 123
C 124
000000000062FE0F
000000000062FE08
0000000000000043
000000000000007C
*/
   
}
还有这个
#include<stdio.h>
int main ()
{
    int ch={8,5,3,2,4};
    int*p1;//定义
    p1=&ch;//取址 与定义分开了 可以这样吗?
    int *p2; //定义
    p2=3;//这里没加*,是把指针当普通整形变量用了吗?
        printf("%d %d",*p1,p2);
        return 0;
}

xingshf79 发表于 2021-5-6 02:51:11

加*是指针所指地址存放的数据,不加*是指针地址。'C'是个常量,124也常量,对两个常量求地址,这什么操作?

yuxijian2020 发表于 2021-5-6 10:49:58

本帖最后由 yuxijian2020 于 2021-5-6 10:52 编辑

你要了解指针的本质,指针的本质就是16进制的数字
32位系统下 指针占8个字节;64位系统下,指针占16个字节
只不过,这个数字代表了内存中的地址
然后再看你的问题
printf("%c %d\n",*pa,*pb);//这里就是取 pa 和 pb 的地址中保存的数据,再以 %c 和 %d 的形式输出到屏幕
// %c 就是 获得一个字节的数据,按ANSI码转换成字符输出到屏幕
// %d 就是 获得 int 大小的数据,转换为10进制,输出到屏幕
   printf("%p\n%p\n",pa,pb);//这里就是直接打印16进制的地址
   printf("%p\n%p\n",'C',124);//这里是把'C' 按ANSI码转换为16进制数字输出
//124 这个数字也是一样,转换为16进制输出到屏幕

然后再看下面的

p1=&ch;//这里是取 ch 数组中第5个元素的地址赋值给p1
    int *p2; //定义
    p2=3;//这里是强行让p2的地址等于3(虽然计算机中没有这种地址,但是强行赋值是可以的)
    printf("%d %d",*p1,p2); //我觉得我上面说的很清楚 这里你应该了解了
    //*p1 就是 取 p1 地址中保存的数据,再以十进制输出到屏幕
    //p2 就是直接把地址转换为10进制输出到屏幕
页: [1]
查看完整版本: 刚学指针的几个问题