小明同学吖 发表于 2022-7-1 00:11:37

求详细一点有很多疑点

#include<stdio.h>
               int main()
               {
                       char a[]="I love you ",b,*p1,*p2;
                       int i;
                       p1=a;                                                这里赋值的时候指针不用带*
                       p2=b;
                       for(;*p1!='\0';p1++,p2++)      而这里p1又带个*是啥意思?
                       {
                               *p2=*p1;                               这里赋值为什么要带个*号赋值?
                       }
                       p2='\0';
                       printf("a:%s\n",a);
                       printf("b:");
                       for(i=0;b!='\0';i++)                上面b已经赋值了p2为啥输出还要遍历一遍?直接跟上面的p2可以不?
                       {
                               printf("%c",b);
                       }
                       printf("\n");
                       
               }

临时号 发表于 2022-7-1 01:08:27

1.为什么p1=a和p2=b赋值为什么不带*
这里的a和b都是数组变量,所谓数组变量,实际上就是指针变量,数组变量的地址指向数组的第一个值
所以,这里只是将指针地址赋给指针,当然可以
2.为什么*p1!='\0'又带个*是啥意思
这里的意思是如果p1所指向的地址的值不为'\0',则继续执行循环
如果不加*号的话,p1!='\0'的意思是p1这个指针所指向的地址不为'\0'的话,则继续执行循环
地址怎么可能为'\0'呢,所以应写成*p1!='\0'
3.*p2=*p1为什么要带个*号赋值
这里的意思是将p1这个指针所指向的地址的值赋值给p2这个指针所指向的地址的值
如果不加*号的话,p2=p1的意思是让p2这个指针指向p1所指向的地址,意思都变了
4.上面b已经赋值了p2为啥输出还要遍历一遍?直接跟上面的p2可以不?
不可以
p2是一个指针变量,在for循环之后你就将p2指向了0地址('\0'会被编译器认为是0地址)
你要是使用p2的话,你的程序会直接被操作系统终止掉

ExiaGN001 发表于 2022-7-1 20:23:03

本帖最后由 ExiaGN001 于 2022-7-1 21:45 编辑

Q1:为啥p1=a;这里赋值的时候指针不用带*?
A1:a其实是一个 常量指针 ,我们平时用的a是 *(a+n) 的简写
      通俗来说,a是你这栋楼,a是你家,现在只知道你在这栋楼里。

Q2:for(;*p1!='\0';p1++,p2++)而这里p1又带个*是啥意思?
A2:p1是一个地址,*p1是这里存的东西。
      通俗来说,p1是你家门牌号,*p1是你这个人。

Q3:*p2=*p1;这里赋值为什么要带个*号赋值?
A3:*p1是p1所指向位置的值,*p2是p2所指向的位置的值。
   它是值对应值
   通俗来说:你要从p1搬到p2,那么p2装的就是你(*p1)

Q4: for(i=0;b[ i ]!='\0';i++)上面b已经赋值了p2为啥输出还要遍历一遍?直接跟上面的p2可以不?
A4:不行。p2此时指向的是NULL,已经变成野指针了。如果使用的话会产生不可预料的危险后果(轻则RuntineError,重则内存泄漏)

页: [1]
查看完整版本: 求详细一点有很多疑点