最近在筹备数据结构课程设计时,偶然发现了一个char和指针相关的问题,真的是把我的薄弱点集中的满满的,都怪大一没有好好学习,欠下的债都是要还的啦~
问题如下:
char *BUSES[BUS_NUM][3]=
{
"1路上行","1站","5站",
"1路下行","5站","1站",
"2路上行","6站","12站",
"2路下行","12站","6站",
"3路上行","9站","12站",
"3路下行","12站","9站",
"4路上行","6站","17站",
"4路下行","17站","6站",
"5路上行","15站","13站",
"5路下行","13站","15站",
};
char *p[10]和char (*p)[10]的区别:
char *p[10]:指针数组
数组名是p,数组大小是10,数组中存放的元素是char *,即指向char类型的指针。
char (*p)[10]:指向大小为10的char数组的指针
其实我当时第一反应就是char *怎么可以指向含有这么多汉字的中文字符串??????
在c/c++中char占一个字节,而一个汉字就是两个字节了,这怎么能输出这么多中文??????
后来我就单独进行测试了一下。
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
char *p="我真的真的真的好爱中国";
int n;
n=sizeof(p);
printf("%d\n",n);
printf("%s",p);
return 0;
}
猜猜测试结果是什么!
我当时就在想为什么!
因为指针一般和数组相关联,我就又测试了数组:
c++:
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
char p[10]="我真的真的真的好爱中国";
int n;
n=sizeof(p);
printf("%d\n",n);
printf("%s",p);
return 0;
}
在c++中这个是报错了的。
c:
#include<stdio.h>
int main()
{
char p[10]="我真的真的真的好爱中国";
int n;
n=sizeof(p);
printf("%d\n",n);
printf("%s",p);
return 0;
}
c中没有报错。
后来我改了一下数组大小:
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
char p[30]="我真的真的真的好爱中国";
int n;
n=sizeof(p);
printf("%d\n",n);
printf("%s",p);
return 0;
}
测试结果如下:
后来我就从指针的本质入手,想通了这个问题。
首先我们看下面这条语句:
char *p=“我真的真的真的好爱中国”;
这个语句完成的是:
1.定义一个char *p,申请空间分配内存;
2.申请空间存储"我真的真的真的好爱中国";
3.把"我真的真的真的好爱中国"的首地址赋值给p;
我们看到了上面的char *p,sizeof ( p )=4!!!
这里需要注意指针内存所占字节与数据类型无关,而是和系统位数有关!!!