求高人!关于指向字符数据的指针数组用scanf %s赋值以及printf %s输出的问题
#include<stdio.h>
void main()
{char *a[2];
int i;
for(i=0;i<2;i++)
scanf("%s",a+i); //a不是a[i]的地址吗?这样输入的值不是给了a[i]吗?而a[i]应该是存地址才对呀
for(i=0;i<2;i++)
printf("%s\n",a+i);//怎么输出不是写成*a[i]?
}
求高手为我解答上面的问题!
顺便给我说一下%s的原理。
万分感谢
[解决办法]
是输入字符串啊,只不过这个字符串是地址!
如果想输入真正的字符串的话:
需要先对char *a[2];初始化,for example: a[1] = malloc();
然后于对a[1]输入字符串
[解决办法]
你定义的是一个指针数组,并没有给这个数组里面的每个指针分配空间
给你的代码修改了一下
#include<stdio.h>
#include <stdlib.h>
#define N 20
void main()
{
char *a[2];
int i;
for(i=0;i<2;i++)
a[i]=(char *)malloc(sizeof(char)*N);
for(i=0;i<2;i++)
scanf("%s",a[i]); //a你定义的不是数组名,是一个指针数组,也就是指针,但加i只是该行字符串往后移动i位
for(i=0;i<2;i++)
printf("%s\n",a[i]);//怎么输出不是写成*a[i]?
for(i=0;i<2;i++)
free(a[i]);
}
#include <stdio.h>
#include <stdlib.h>
void main()
{
char *a[2];
int i;
for(i=0;i<2; i++)
{
*(a + i) = (char *)malloc(10*sizeof(char));
scanf("%s",*(a+i)); //a不是a[i]的地址吗?这样输入的值不是给了a[i]吗?而a[i]应该是存地址才对呀
}
for(i=0;i<2;i++)
{
printf("%s\n",*(a+i));//怎么输出不是写成*a[i]?
free(*(a + i));
}
}
scanf("%s",a+i); //a不是a[i]的地址吗?这样输入的值不是给了a[i]吗?而a[i]应该是存地址才对呀scanf函数的功能是将要输入的数据存放到你指定的已经分配的地址中(也就是指针中)而a + i还是指针类型么,不是的,它是指针的指针。有没有可以直接进行控制指针的格式呢,好像目前还没有,所以才会出现编译错误。但是为了还能进行使用,所以我们首先解引用回到指针这个层面上来就比较容易一些了。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?
不要写连自己也预测不了结果的代码!
电脑内存只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、……