char *a,char *a[],char a[]等的区别

jinianjun 2011-05-06 08:31:47
char a1[3] = {1, 2, 3}; //这个对吗???好像不对吧
char a2[3] = {'1', '2', '3'};//这个是好像有错误,应该是char a2[4] = {'1', '2', '3',‘/0’}
char a3[4] = "123";

char *a
char *a[]
char (*a)[]
之间的区别!

...全文
309 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaolomg 2011-05-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 loaden 的回复:]

引用 13 楼 jinianjun 的回复:

引用 8 楼 ljt3969636 的回复:
没有/0的情况下字符串输出会有多远走多远直到遇见一个字节的二进制0

char a2[3] = {'1', '2', '\0'};
char a3[4] = "123";
我给a2[3]加了个'\0',没问题。
但是char a1[3] = {1, 2, 3};怎么办啊?我加了'\0'还……
[/Quote]
#include <iostream>
using namespace std;
int main( void )
{
char a1[4] = {'1', '2', '3'};
cout << a1 << endl;
for (int i = 0; i < sizeof(a1) / sizeof(char); ++i)
cout << a1[i] << endl;
return 0;
}
这样输出貌似也可以,为什么要转换成int呢?
FrankHB1989 2011-05-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 loaden 的回复:]

char的可赋值范围是:-128~127
只要在这个范围内的值,都可以赋给它而不溢出。

[/Quote]

渣解。没进一步限定具体平台时,不要指望char的算术运算行为和signed char一样。
CppCoder 2011-05-07
  • 打赏
  • 举报
回复
指针的学习很重要
whut_lcy 2011-05-07
  • 打赏
  • 举报
回复
int a //整数
int *a //指向整数的指针
int *a[10] //一个数组, 元素有10个,每个元素装的是一个int型的指针
int (*a)[10] //一个指针,指向一个数组,该数组有10个整形元素

int f(int) //一个函数,返回类型int,带有一个int的参数
int (*f)(int) //一个指针,指向一个函数,该函数返回类型int,带一个int的参数
int (*f[10])(int) //一个数组,该数组有10个元素,每个元素是指针,该指针指向一个函数,该函数返回类型int,带一个int参数

慢慢想吧。

wuchengfeng222 2011-05-07
  • 打赏
  • 举报
回复
正在学这块 支持一个 学习了。
一根烂笔头 2011-05-07
  • 打赏
  • 举报
回复
根据楼上讨论,我给你总结!

#include <iostream>

using namespace std;

int main()
{
//声明一点:字符数组,
//1.要考虑多申请一个字符的空间,因为一个字符数组要以‘\0’标志字符串结束

char a1[4] = {1, 2, 3};// char a1[3] = {1, 2, 3};也不算错,但会输出多余的东西直到遇到一个‘\0’结束输出
char a2[4] = {'1', '2', '3'};
//等价于char a2[4] = {'1', '2', '3',‘\0’};char a2[3] = {'1', '2', '3'}也不错!
char a3[4] = "123";//char a3[3] = "123"是错误!因为"123"实质上四个字符!

cout<<a1<<endl;
cout<<a2<<endl;
cout<<a3<<endl;

//2.不用多申请,用sizeof(a) / sizeof(char)形式获取数组实际的大小
char a4[3] = {'1', '2', '3'};
for (int i = 0; i < sizeof(a4) / sizeof(char); ++i)
cout << (int)a4[i] << endl;

char c = 'c',*b = &c;//字符指针,或者字符串指针

cout<<*b<<endl;
b="abc";
cout<<b<<endl;

char *b1[2];//字符串指针数组
b1[0]=b;
cout<< b1[0]<<endl;
b1[1]=b;
cout<< b1[1]<<endl;

char b3[2][2] = {'0','1','2','3'},(*b2)[2];//字符串指针数组
b2 = b3;
for(int i = 0; i < 2; i++)
{
for(int j = 0; j < 2; j++)
cout<<b2[i][j];
cout<<endl;
}
return 0;
}

jinianjun 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 jinianjun 的回复:]
加'\0'和不加'\0'在这里跟乱码有什么关系?a1和a2只是字符数组,又不是字符串,跟一般的数组没啥区别,输出a1是乱码是因为ascii码为1,2,3的那三个字符不能在终端显示而已。

这个我还能理解,谢谢大哥啊
[/Quote]
我改了改,对了,就是大哥说的,
char a1[4] = {65, 66, 67,'\0'};
cout<<a1<<endl;
这样输出的就是ABC(65,,6,67分别是ABC的ASCII码)
jinianjun 2011-05-06
  • 打赏
  • 举报
回复
加'\0'和不加'\0'在这里跟乱码有什么关系?a1和a2只是字符数组,又不是字符串,跟一般的数组没啥区别,输出a1是乱码是因为ascii码为1,2,3的那三个字符不能在终端显示而已。

这个我还能理解,谢谢大哥啊
jinianjun 2011-05-06
  • 打赏
  • 举报
回复
char a1[3] = {1, 2, 3};
这样的赋值的时候没有单引号是什么情况啊???赋的是什么值呢?
dreamhunter_lan 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jinianjun 的回复:]

引用 8 楼 ljt3969636 的回复:
没有/0的情况下字符串输出会有多远走多远直到遇见一个字节的二进制0

char a2[3] = {'1', '2', '\0'};
char a3[4] = "123";
我给a2[3]加了个'\0',没问题。
但是char a1[3] = {1, 2, 3};怎么办啊?我加了'\0'还是不行啊 !还是乱码。怎么能正常输出啊
[/Quote]
加'\0'和不加'\0'在这里跟乱码有什么关系?a1和a2只是字符数组,又不是字符串,跟一般的数组没啥区别,输出a1是乱码是因为ascii码为1,2,3的那三个字符不能在终端显示而已。
jinianjun 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 loaden 的回复:]
你可以检验一下:
char a1[3] = {'1', '2', '3'};
的输出是什么。
这样理解会更好些。
[/Quote]
char a1[3] = {1, 2, 3};
cout<<(int)a1[0]<<endl;
这样强制类型转换没问题,输出的a[0],a[1],a[2]都没问题,但是(int)a1输出的是2620836,是什么意思啊???
老邓 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jinianjun 的回复:]

引用 8 楼 ljt3969636 的回复:
没有/0的情况下字符串输出会有多远走多远直到遇见一个字节的二进制0

char a2[3] = {'1', '2', '\0'};
char a3[4] = "123";
我给a2[3]加了个'\0',没问题。
但是char a1[3] = {1, 2, 3};怎么办啊?我加了'\0'还是不行啊 !还是乱码。怎么能正常输出啊
[/Quote]
你还是没理解。
运行一下这个代码:
#include <iostream>

using namespace std;

int main()
{
char a1[4] = {'1', '2', '3'};
cout << a1 << endl;
for (int i = 0; i < sizeof(a1) / sizeof(char); ++i)
cout << (int)a1[i] << endl;
return 0;
}
jinianjun 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ljt3969636 的回复:]
没有/0的情况下字符串输出会有多远走多远直到遇见一个字节的二进制0
[/Quote]
char a2[3] = {'1', '2', '\0'};
char a3[4] = "123";
我给a2[3]加了个'\0',没问题。
但是char a1[3] = {1, 2, 3};怎么办啊?我加了'\0'还是不行啊 !还是乱码。怎么能正常输出啊
老邓 2011-05-06
  • 打赏
  • 举报
回复
你可以检验一下:
char a1[3] = {'1', '2', '3'};
的输出是什么。
这样理解会更好些。
老邓 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jinianjun 的回复:]
用什么来输出判断好呢?
[/Quote]
按整型输出,或调试时看内存。
#include <iostream>

using namespace std;

int main()
{
char a1[3] = {1, 2, 3};
for (int i = 0; i < sizeof(a1) / sizeof(char); ++i)
cout << (int)a1[i] << endl;
return 0;
}
jinianjun 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 loaden 的回复:]
引用 6 楼 jinianjun 的回复:

上面的代码有错误,我改了一下
C/C++ code
char a1[3] = {1, 2, 3};
cout<<a1<<endl;

char a2[3] = {'1', '2', '\0'};
cout<<a2<<endl;

char a3[4] = "123";
cout<<a3<<endl;
cin.get();

……
[/Quote]
那大哥用什么来输出判断好呢?
老邓 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jinianjun 的回复:]

上面的代码有错误,我改了一下
C/C++ code
char a1[3] = {1, 2, 3};
cout<<a1<<endl;

char a2[3] = {'1', '2', '\0'};
cout<<a2<<endl;

char a3[4] = "123";
cout<<a3<<endl;
cin.get();

刚测试了一下,a2……
[/Quote]
char的可赋值范围是:-128~127
只要在这个范围内的值,都可以赋给它而不溢出。

所以不要用cout来判断是否正确。
ljt3969636 2011-05-06
  • 打赏
  • 举报
回复
没有/0的情况下字符串输出会有多远走多远直到遇见一个字节的二进制0
ljt3969636 2011-05-06
  • 打赏
  • 举报
回复
char a3[4] = "123";等价形式是char a2[4] = {'1', '2', '3',‘/0’}

char *a1 指向char类型或者字符串a1+1等于加了一个字节

char *a2[] a2数组里存的是char* 。a2这个符号本身一些情况下会隐式转成char**类型

char (*a3)[n] a3本身是char (*)[n]类型 a3+1相当于加了n个字节
jinianjun 2011-05-06
  • 打赏
  • 举报
回复
上面的代码有错误,我改了一下
char a1[3] = {1, 2, 3};
cout<<a1<<endl;

char a2[3] = {'1', '2', '\0'};
cout<<a2<<endl;

char a3[4] = "123";
cout<<a3<<endl;
cin.get();

刚测试了一下,a2,a3都是输出字符串,但是a1输出是乱码,改成a1[0]也还是乱码,怀疑是不是这样赋值不可以
加载更多回复(5)

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧