请问指针数组可以用循环来赋值吗?用scanf(“%s”,s[i]);这样可以吗?怎样可以随时给指针数组赋值

如题所述

这样给指针数组赋值不仅语法不对,逻辑也不妥!一来scanf函数似乎没有提供接收指针的专门格式控制字符串;由于指针也就是地址,是一个无符号整型数据,所以应该用%d或%x或%X来控制,用%s显然是错误的。二来若s是指针数组,那么s[i]仍然只是个元素,而scanf是要求用元素地址的。所以scanf(“%s”,s[i]);似乎应该为scanf("%d",&s[i]);或scanf("%x",&s[i]);或scanf("%x",&s[i]);才对。第三,给一个指针手工赋值是不提倡的,因为手工输入的地址可能侵犯到系统的敏感部位而造成不可预知的后果。所以在下认为不这样做为好。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-05-06
楼上的回答是错误的,你的那样就可以了,因为它本身就是指针,还取什么地址呢,但有个问题,你必须对应的给它开辟一个空间才可以,比如,char a[5];s[0] = a才可以,否则还是不行追问

#define z 5
void main()
{
char *s[z];
int i;
for(i=0;i<z;i++)
scanf("%s",s[i]);
大致这样,已经开辟空间了啊,但不可以赋值

是不是指针数组只能赋初值呢?

追答

你这样没有开辟空间 , 这样才是开辟了空间 , 自己好好体会一下吧
指针数组当然不是只能赋初值
#include
#include

#define z 5
void main()
{
char *s[z];
int i ;
for( i = 0 ; i <5 ; i++ )
{
s[ i ] = ( char * )malloc( sizeof( char ) ) ; //动态开辟 (就像char a[5] ; s[0] = a)
}
for(i=0;i<z;i++)
scanf("%s",s[i]);
}

本回答被提问者采纳
第2个回答  2011-05-06
因为这是个指针,指针保存的是地址,地址怎么能由用户手动输入呢?(比如:float *p; cin>>p;//用户输入了1.1,首先对编译器来说,是类型不匹配,怎么能把float型数据赋给float*型呢?再者有1.1这个地址吗?地址都是整数吧,就算换成了整型也是行不通的,不是由用户来说某某地址存数据的,假如你定义了int i=10;你能指定10存放在哪吗?这还是由系统来分配指定的,你仔细想想,这个表达起来有点绕口)只有已经定义了的一个变量,在内存中有了数据,它才有了地址,才能把这个地址赋给指针 。
给你举个例子
#include<iostream>
using namespace std;
void main(void)
{
int * p[3];
int data[3]={1,2,3};
for(int i=0;i<3;i++)
{
p[i]=&data[i]; //给指针数组赋值
cout<<p[i]<<endl; //输出结果是三个地址(存贮1,2,3的地址)
cout<<*p[i]<<endl;//输出结果1(换行)2(换行)3(换行)
}
}
第3个回答  2011-05-06
scanf("%s",&s[i]);就可以了,一定要有&,来指定一个地址值;追问

s[i]本身就已经是指针了,再加&是什么意思呢

第4个回答  2011-05-11
可以试着用gets()函数给指针赋值
例如
char *p[3],ter[3][20];
int i;
for(i=0;i<3;i++)
p[i]=gets(ter[i]);
相似回答