一个指针程序的有关问题
一个指针程序的问题
大家请看下面这个程序
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
char a[]= "I am a boy ",b[20];
int i;
for(i=0;*(a+i)!= '\0 ';i++) *(b+i)=*(a+i);
*(b+i)= '\0 ';
cout < < "string a is : " < <a < <endl;
cout < < "string b is : " < <b < <endl;
system( "PAUSE ");
return EXIT_SUCCESS;
}
这个程序我有两个问题,首先说明我用的是dev c++
上面程序里 的这个语句
int i;
for(i=0;*(a+i)!= '\0 ';i++) *(b+i)=*(a+i);
*(b+i)= '\0 ';
是否可以改成
for(int i=0;*(a+i)!= '\0 ';i++) *(b+i)=*(a+i);
*(b+i)= '\0 ';
我试了一下,如果注销*(b+i)= '\0 ';编译就没有问题,否则就要报错.
看编译器的英文注释似乎在说 i是捆绑在for语句里面的在for外面就不能用了,不知是不是这样,高手给指点下.
第二个是关于指针的问题,由于上面我在定义的时候定义了个b[20],但其实我并没有用到20个空间,所以我就想用指针*b来定义,就是
char a[]= "I am a boy ",*b;
这样一改编译是对的,但运行却是错的,
看意思是一定要预先给b数组分配空间,否则就要报错
于是我试试改成这样
char a[]= "I am a boy ",*b=new char[1000];
给指针先分配个空间,试了下果然又对了.
这种问题又是怎么回事情,请高手指点。
------解决方案--------------------
第二个是关于指针的问题,由于上面我在定义的时候定义了个b[20],但其实我并没有用到20个空间,所以我就想用指针*b来定义,就是
=========================================
char* b;
只是定义了一个指针型字符串,但没有给其分配内存空间,一般在使用前调用:
b = new char[SIZE];
或 b = (char*) malloc(sizeof(char));
来分配空间,但注意:在使用完成后,最好用delete[] b; 或 free(b); 来释放空间。
------解决方案--------------------
你用*b, 只定义了指针, *b指向的东西啥都不是, 乱指,当然出错了
如果这里*b不指向已经定义好的数组的话
你就要new出空间给他
也就是说, 使用*b, b指向的内容一定是实际存在且可用的
------解决方案--------------------
A_snail(蜗)(牛)VS.(钉)(子) ( ) 信誉:100 Blog 加为好友 2007-04-13 12:46:33 得分: 0
for(int i=0;*(a+i)!= '\0 ';i++) *(b+i)=*(a+i);
*(b+i)= '\0 ';
=============================================================
改成:
for(int i=0;*(a+i)!= '\0 ';i++)
{
*(b+i)=*(a+i);
*(b+i)= '\0 ';
}
----------------------------------------------
你觉得这样改对吗?这样b的值不都变成 '\0 '了吗?
大家请看下面这个程序
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
char a[]= "I am a boy ",b[20];
int i;
for(i=0;*(a+i)!= '\0 ';i++) *(b+i)=*(a+i);
*(b+i)= '\0 ';
cout < < "string a is : " < <a < <endl;
cout < < "string b is : " < <b < <endl;
system( "PAUSE ");
return EXIT_SUCCESS;
}
这个程序我有两个问题,首先说明我用的是dev c++
上面程序里 的这个语句
int i;
for(i=0;*(a+i)!= '\0 ';i++) *(b+i)=*(a+i);
*(b+i)= '\0 ';
是否可以改成
for(int i=0;*(a+i)!= '\0 ';i++) *(b+i)=*(a+i);
*(b+i)= '\0 ';
我试了一下,如果注销*(b+i)= '\0 ';编译就没有问题,否则就要报错.
看编译器的英文注释似乎在说 i是捆绑在for语句里面的在for外面就不能用了,不知是不是这样,高手给指点下.
第二个是关于指针的问题,由于上面我在定义的时候定义了个b[20],但其实我并没有用到20个空间,所以我就想用指针*b来定义,就是
char a[]= "I am a boy ",*b;
这样一改编译是对的,但运行却是错的,
看意思是一定要预先给b数组分配空间,否则就要报错
于是我试试改成这样
char a[]= "I am a boy ",*b=new char[1000];
给指针先分配个空间,试了下果然又对了.
这种问题又是怎么回事情,请高手指点。
------解决方案--------------------
第二个是关于指针的问题,由于上面我在定义的时候定义了个b[20],但其实我并没有用到20个空间,所以我就想用指针*b来定义,就是
=========================================
char* b;
只是定义了一个指针型字符串,但没有给其分配内存空间,一般在使用前调用:
b = new char[SIZE];
或 b = (char*) malloc(sizeof(char));
来分配空间,但注意:在使用完成后,最好用delete[] b; 或 free(b); 来释放空间。
------解决方案--------------------
你用*b, 只定义了指针, *b指向的东西啥都不是, 乱指,当然出错了
如果这里*b不指向已经定义好的数组的话
你就要new出空间给他
也就是说, 使用*b, b指向的内容一定是实际存在且可用的
------解决方案--------------------
A_snail(蜗)(牛)VS.(钉)(子) ( ) 信誉:100 Blog 加为好友 2007-04-13 12:46:33 得分: 0
for(int i=0;*(a+i)!= '\0 ';i++) *(b+i)=*(a+i);
*(b+i)= '\0 ';
=============================================================
改成:
for(int i=0;*(a+i)!= '\0 ';i++)
{
*(b+i)=*(a+i);
*(b+i)= '\0 ';
}
----------------------------------------------
你觉得这样改对吗?这样b的值不都变成 '\0 '了吗?