鱼C论坛

 找回密码
 立即注册
查看: 1644|回复: 2

[已解决]求详细一点有很多疑点

[复制链接]
发表于 2022-7-1 00:11:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
                 int main()
                 {
                         char a[]="I love you ",b[40],*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[i]!='\0';i++)                上面b已经赋值了p2为啥输出还要遍历一遍?直接跟上面的p2可以不?
                         {
                                 printf("%c",b[i]);
                         }
                         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的话,你的程序会直接被操作系统终止掉
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 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的话,你的程序会直接被操作系统终止掉
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-1 20:23:03 | 显示全部楼层
本帖最后由 ExiaGN001 于 2022-7-1 21:45 编辑

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

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,重则内存泄漏)

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 12:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表