求详细一点有很多疑点
#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");
} 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 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]