求高人!关于指向字符数据的指针数组用scanf %s赋值以及printf %s输出的有关问题

求高人!关于指向字符数据的指针数组用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]?
}

求高手为我解答上面的问题!求高人!关于指向字符数据的指针数组用scanf %s赋值以及printf %s输出的有关问题
顺便给我说一下%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还是指针类型么,不是的,它是指针的指针。有没有可以直接进行控制指针的格式呢,好像目前还没有,所以才会出现编译错误。但是为了还能进行使用,所以我们首先解引用回到指针这个层面上来就比较容易一些了。
------解决思路----------------------
引用:
引用:你定义的是一个指针数组,并没有给这个数组里面的每个指针分配空间
给你的代码修改了一下
C/C++ code?12345678910111213141516#include<stdio.h>#include <stdlib.h>#define N 20void main(){    char *a[2];    int i;……

因为数组的接线时程序员自己控制,编译器是完全相信程序员的
所以就很容易出现问题
因为你这个指针都没有初始化,就直接进行操作了,所以很危险的操作了
------解决思路----------------------
printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方,而且通常编译还不出错。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑!
这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!!

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。