请教一个指针的问题,被指针伤到了
下面这段代码在输入第二组数据时会出错
- C/C++ code
#include<stdio.h>#include<string.h> using namespace std;char str[10][10],s[10]; void fun(char **str,char *s){ if(str[0]!=NULL) printf("temp == %s\n",str[0]); } int main(){ while(scanf("%s",&s)==1) { fun((char**)str,s); strcpy(str[0],s); printf("str == %s \n",str[0]); } return 0;}而fun函数如果是空函数的话就没问题,为什么?
- C/C++ code
#include<stdio.h>#include<string.h> using namespace std;char str[10][10],s[10]; void fun(char **str,char *s){// if(str[0]!=NULL)// printf("temp == %s\n",str[0]); } int main(){ while(scanf("%s",&s)==1) { fun((char**)str,s); strcpy(str[0],s); printf("str == %s \n",str[0]); } return 0;}[解决办法]
- C/C++ code
#include <stdio.h>#include <string.h> char str[10][10],s[10]; void fun(char **str,char *s){ if(str[0]!=NULL) printf("temp == %s\n",str); // 楼主自己看下这一行与你的有什么区别} int main(){ while(scanf("%s",&s)==1) { fun((char **)str,s); strcpy(str[0],s); printf("str == %s \n",str[0]); } return 0;}
[解决办法]
二维数组不等于二级指针
void fun(char **_str,char p[][10],char *s)
{
printf("%s",_str[0]); //错
printf("%s",p[0]); //对
return;
}
fun((char**)str,str,s);
二级指针_str指向的是整个数组
p指向的是第一行
虽然地址都一样 但是解析范围不一样
一样道理
char str[10][10];
char **k = (char**) str;
strcpy(str[0],"123");
printf("%s",str[0]); //对
printf("%s",k[0]); //错
[解决办法]
二级指针不能直接对应于二维数组
此例中二级指针的使用必须需要一级指针,这个一级指针提供一维数组的信息----元素个数!
调用传参时
形参str(纯二级指针变量--没有任何数组概念)由实参str(实际是&str[0])初始化,即形参str指向了实参数组的首行,后果是形参str并不知道实参数组的行数和列数,并且它将它指向位置(实参数组首行的前四个字符码值)的值当作一级指针来用!
测试:
char str[10][10]={"ABCD"};
void fun(char **str,char *s)
{
printf("%p\n",*str);//应该是ABCD的ASCII码值
}
[解决办法]
如果希望使用二级指针来引用二维数组
那么在传递函数参数的时候,请带上数组第1维的维数
这样可以通知编译器,这个二级指针指向的是二维数组
那么在进行下标运算的时候,编译器就知道如何行动了
指针和数组还是有区别的
建议楼主搜索一下相关资料
或者可以读一本书 《C和指针》