注册 登录
编程论坛 C语言论坛

小白求助 关于二维数组的问题

d7se123 发布于 2020-03-14 10:54, 2697 次点击
#define _CRT_SECURE_NO_WARNINGS
#define LEN 4
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

void printArr(char(*p)[10]);

void printArr(char(*p)[10])
{
    int i;
    for ( i = 0; i < LEN; i++)
    {
        printf("%s\n", p[i]);
    }
}

void sortArr(char(*pArr)[10])
{
    int i, j;
    char* tmp = NULL;
    for (i = 0; i < LEN; i++)
    {
        for (j = i + 1; j < LEN; j++)
        {
            if (strcmp(pArr[i], pArr[j]) > 0)  
            {
            //问题:pArr[i]不是指向二维数第一行[10]的首元素吗?那pArr[i] pArr[j]应该是一个指针 为啥后面交换指针的值失败呢?
                tmp = pArr[i];
                pArr[i] = pArr[j];
                pArr[j] = tmp;
            }
        }
    }
}

void main()
{
    char buf[4][10] = { "aaaaa","ccccc","bbbbb","11111" };
    printf("排序之前\n");
    printArr(buf);

    sortArr(buf);

    printf("排序之后\n");
    printArr(buf);
    system("pause");
}
17 回复
#2
rjsp2020-03-14 11:53
char(*pArr)[10]
那么 pArr[i] 的类型是 char[10],不是什么指针。
说数组是指针的蠢货 远一点儿。

孔子说过“举一隅不以三隅反,则不复也”,交换两个int对象你会么?
{
    int tmp = a;
    a = b;
    b = tmp;
}
现在你要交换两个char[10],那只要将char[10]替换掉int就行了
{
    char tmp[10];
    memcpy( tmp, pArr[i], 10 );
    memcpy( pArr[i], pArr[j], 10 );
    memcpy( pArr[j], tmp, 10 );
}
怎么会联想到 八竿子打不着的指针 上去?
#3
d7se1232020-03-14 13:23
只有本站会员才能查看附件,请 登录


这是c和指针书上写的 char buf[3][4]
buf代表 每一行的地址 buf+1跳4个字节
buf[0] buf[1] buf[2]代表一维数组的首地址 是buf[0]是如"aaaaa" 中第一个a的地址
*(buf+i)+j代表 i行j列的地址
*((buf+i)+j)代表i行j列的元素 等同于buf[i][j]
#4
d7se1232020-03-14 13:24
回复 2楼 rjsp
大哥 你看看我的回复
#5
叶纤2020-03-14 13:35
数组是聚合是数据类型,它可以装好多变量的,数据类型有数据成员,用下标表示,
指针只是个针,没有空间,只指向某一地址,所以指针装不下数据变量
#6
forever742020-03-14 13:50
以下是引用d7se123在2020-3-14 10:54:42的发言:

            //问题:pArr不是指向二维数第一行[10]的首元素吗?那pArr[j]应该是一个指针 为啥后面交换指针的值失败呢?
 


“是一个指针”这种说法误导了你,
事实上它是一个地址,也就是“指针常量”,只能做右值使用,因此不能被赋值。
就和你不能给数组名赋值道理相同。

[此贴子已经被作者于2020-3-14 13:51编辑过]

#7
叶纤2020-03-14 13:51
还有,市面上很多书籍教的都很半吊子,如果书上教的是错误思想,那么出书的人这方面的基础知识欠佳,还是离错误思维远一些,吸收正确思维,看一看正规作者的书是正道,

冒昧的问一句你看的是什么书?
#8
叶纤2020-03-14 14:13
http://www.
你看看这个,和你书上一样的图但是人家全篇没提过一个指针,只说连续内存位置
#9
叶纤2020-03-14 16:04
以下是引用d7se123在2020-3-14 13:23:41的发言:



这是c和指针书上写的 char buf[3][4]
buf代表 每一行的地址 buf+1跳4个字节
buf[0] buf[1] buf[2]代表一维数组的首地址 是buf[0]是如"aaaaa" 中第一个a的地址
*(buf+i)+j代表 i行j列的地址
*((buf+i)+j)代表i行j列的元素 等同于buf[j]

buf代表 每一行的地址 buf+1跳4个字节  
buf不应该是代表第0行的地址吗?buf+1不应该代表第1行的地址吗
buf[0] buf[1] buf[2]代表一维数组的首地址 是buf[0]是如"aaaaa" 中第一个a的地址  

不应该这样讲吗?buf[3]代表一维数组的首地址是buf[0]吗
*(buf+i)+j代表 i行j列的地址   

这一句还能说的痛
*((buf+i)+j)代表i行j列的元素 等同于buf[j][  

这一句估计你写错了,你是不是想写**(buf+i)+j或者*(*(buf+i)+j)
#10
d7se1232020-03-14 16:51
回复 7楼 叶纤
我看的是c和指针
#11
d7se1232020-03-14 16:51
回复 9楼 叶纤
*(*(buf+i)+j)是这个  前面写错了
#12
d7se1232020-03-14 16:55
回复 9楼 叶纤
谢谢老哥
#13
d7se1232020-03-14 16:55
回复 2楼 rjsp
谢谢了
#14
d7se1232020-03-14 16:56
回复 6楼 forever74
哦哦 明白了
#15
d7se1232020-03-14 19:51
回复 6楼 forever74
大哥 有地址的不是左值吗?
#16
forever742020-03-14 20:43
现阶段不建议你继续挖下去,记住核心说法:“常量不能被赋值”

=======================================================================
以下部分其实不建议你着急,因为概念多了会迷糊。
=======================================================================
语言学需要探讨精确的语义,“是地址”和“有地址”是一码事儿么?

何况是谁给你的信心说有地址的就是左值了?
你当const都是摆设么?
另外函数都有地址,能当左值的函数肯定不是C语言。
#17
dpj1492020-03-14 22:21
#define _CRT_SECURE_NO_WARNINGS
#define LEN 4
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

void printArr(char *p[10]);

void printArr(char *p[10])  //输出每行字符串
{
    int i;
    for (i = 0; i < LEN; i++)
    {
        printf("%s\n", p[i]);
    }
}

void sortArr(char *pArr[10])
{
    int i, j;
    char* tmp = NULL;
    for (i = 0; i < LEN; i++)
    {
        for (j = i + 1; j < LEN; j++)
        {
            if (strcmp(pArr[i], pArr[j]) > 0)
            {
                //问题:pArr[i]不是指向二维数第一行[10]的首元素吗?那pArr[i] pArr[j]应该是一个指针 为啥后面交换指针的值失败呢?
                tmp = pArr[i];
                pArr[i] = pArr[j];
                pArr[j] = tmp;
            }
        }
    }
}

void main()
{
    char *buf[10] = { "aaaaa","ccccc","bbbbb","11111" };
    printf("排序之前\n");
    printArr(buf);

    sortArr(buf);

    printf("排序之后\n");
    printArr(buf);
    system("pause");
}
#18
dpj1492020-03-14 22:27
回复 17楼 dpj149
已经把你的错误修改了,可以正常运行了。我也是初学,第一:字符数组和字符串数组是两个概念,你这个程序是对字符串进行排序,不能用字符数组哪套去做。第二:字符串很特殊,根据我的理解,它在内存是静态存储的,可以直接理解成地址。
1