读书人

请问一个指针的有关问题被指针伤到了

发布时间: 2012-08-29 08:40:14 作者: rapoo

请教一个指针的问题,被指针伤到了
下面这段代码在输入第二组数据时会出错

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和指针》

读书人网 >C语言

热点推荐