鱼C论坛

 找回密码
 立即注册
查看: 1054|回复: 15

[已解决]数组指针错误

[复制链接]
发表于 2020-12-4 15:44:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#include<string.h>
void sort(char (*c)[10])
{
        int i,j;
        char b[10];
        for(i=0;i<10;i++)
        {
                for(j=0;j<10-1-i;j++)
                {
                        if(strcmp(c[j],c[j+1])>0)
                        {
                                strcpy(b,c[j]);
                                strcpy(c[j],c[j+1]);
                                strcpy(c[j+1],b);
                        }
                }
        }
        for(i=0;i<10;i++)
        {
                printf("%s ",c[i]);
        }
}
int main()
{
        int i=0;
        char c[10][10],(*p)[10];//数组指针p  
        while(i<10)
        {
                scanf("%s",&c[i]);
                i++;
        }
        for(i=0;i<10;i++)
        {
                p[i]=c[i]; //这一行出错了 说我指针分配无效,怎么改呀
        }
        sort(p);
        return 0;
}
最佳答案
2020-12-8 17:20:09
头发 发表于 2020-12-8 16:33
i变化 关p和c啥事

二维数组元素和指针之间的对应关系:

例如,有如下定义:
int a[3][4]={{10,20,30,40,},{50,60,70,80},{90,91,92,93}};
则数组a有3个元素,分别为a[0]、a[1]、a[2]。而每个元素都是一个一维数组,各包含4个元素,如a[1]的4个元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。
若有:
int *p=a[0];
则数组a的元素a[ i ][ j ]对应的指针为:p + i * 4 + j
元素a[1][2]也就可以表示为:*( p + i * 4 + j)

对上述二维数组 a,虽然 a [0 ]、a都是数组首地址,但二者指向的对象不同。

a[ 0 ]是一维数组的名字,它指向的是一维数组 a[ 0 ]的首元素 a[ 0 ][ 0 ],对其进行 “ * ” 运算,得到的是一维数组元素 a[ 0 ][ 0 ] 的值,即 *a[ 0 ]与a[ 0 ][ 0 ]是同一个值。

而 a 是一个二维数组的名字,它指向的是二维数组 a 的首元素 a[ 0 ],对 a 进行 “ * ” 运算,得到的是一维数组 a[ 0 ]的首地址,即 *a 与 a[ 0 ] 是同一个值。它的指针移动单位是“行”,所以 a + i 指向的是第 i 个行数组,即指向 a[ i ]。

当用 int *p;定义指针 p 时,p 的指向是一个 int 型数据,而不是一个地址,因此,用 a[ 0 ]对 p 赋值是正确的,而用 a 对 p 赋值是错误的。

另外,由上述说明,我们还可以得到二维数组元素的一种表示方法:
对于二维数组 a,其 a[ 0 ]数组由a指向,a[ 1 ]数组则由 a + 1指向,a[ 2 ]数组由 a + 2 指向,以此类推。因此,*a 与 a[ 0 ] 等价、*(a + 1) 与 a[ 1 ] 等价、*(a + 2) 与 a[ 2 ] 等价,┅,即对于 a[ i ] 数组,由 *(a + i) 指向。

由此,对于数组元素 a[ i ][ j ],用数组名 a 的表示形式为:*(*(a + i) + j)
指向该元素的指针为:*(a + i) + j
数组名虽然是数组的地址,但它和指向数组的指针变量不完全相同。指针变量的值可以改变,即它可以随时指向不同的数组或同类型变量,而数组名自它定义时起就确定下来,不能通过赋值的方式使该数组名指向另外一个数组。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-4 17:29:12 | 显示全部楼层
char c[10][10], (*p)[10];
p = &c[10];

你这样定义试试,由于你是要输入十个字符串,我调试节两次,太烦人,每次100个字符呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-12-4 20:15:59 | 显示全部楼层
风过无痕1989 发表于 2020-12-4 17:29
char c[10][10], (*p)[10];
p = &c[10];

多谢老哥!!错误那句原先是p[i]=c[i]  
不知道咋回事就成p=c了,而且就对了????啥原理 i++跟p=c啥关系呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-4 20:16:46 | 显示全部楼层
风过无痕1989 发表于 2020-12-4 17:29
char c[10][10], (*p)[10];
p = &c[10];

p【i】=c【i】 英文的总动消除???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-4 20:43:20 | 显示全部楼层
头发 发表于 2020-12-4 20:15
多谢老哥!!错误那句原先是p=c  
不知道咋回事就成p=c了,而且就对了????啥原理 i++跟p=c啥关系呀

你定义的指针是 (*p)[10],若是直接  p = c 就会出现左侧右侧不匹配的错误,所以,将行地址赋给指针,就解决这个问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-4 20:50:54 | 显示全部楼层
风过无痕1989 发表于 2020-12-4 20:43
你定义的指针是 (*p)[10],若是直接  p = c 就会出现左侧右侧不匹配的错误,所以,将行地址赋给指针,就 ...

p【i】=c【i】 英文的总动消除??? 老哥请看这句

改成p=c后就对了 没加p=&a【10】  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-6 16:11:37 | 显示全部楼层
头发 发表于 2020-12-4 20:50
p【i】=c【i】 英文的总动消除??? 老哥请看这句

改成p=c后就对了 没加p=&a【10】

改成 p = c,我的 VS2015 警告错误呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-8 16:32:39 | 显示全部楼层
风过无痕1989 发表于 2020-12-6 16:11
改成 p = c,我的 VS2015 警告错误呀

我的能运行成功呀,啥原理老哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-8 16:33:11 | 显示全部楼层
风过无痕1989 发表于 2020-12-6 16:11
改成 p = c,我的 VS2015 警告错误呀

i变化 关p和c啥事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-8 17:06:15 | 显示全部楼层
头发 发表于 2020-12-8 16:32
我的能运行成功呀,啥原理老哥

你用什么编译器?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-8 17:20:09 | 显示全部楼层    本楼为最佳答案   
头发 发表于 2020-12-8 16:33
i变化 关p和c啥事

二维数组元素和指针之间的对应关系:

例如,有如下定义:
int a[3][4]={{10,20,30,40,},{50,60,70,80},{90,91,92,93}};
则数组a有3个元素,分别为a[0]、a[1]、a[2]。而每个元素都是一个一维数组,各包含4个元素,如a[1]的4个元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。
若有:
int *p=a[0];
则数组a的元素a[ i ][ j ]对应的指针为:p + i * 4 + j
元素a[1][2]也就可以表示为:*( p + i * 4 + j)

对上述二维数组 a,虽然 a [0 ]、a都是数组首地址,但二者指向的对象不同。

a[ 0 ]是一维数组的名字,它指向的是一维数组 a[ 0 ]的首元素 a[ 0 ][ 0 ],对其进行 “ * ” 运算,得到的是一维数组元素 a[ 0 ][ 0 ] 的值,即 *a[ 0 ]与a[ 0 ][ 0 ]是同一个值。

而 a 是一个二维数组的名字,它指向的是二维数组 a 的首元素 a[ 0 ],对 a 进行 “ * ” 运算,得到的是一维数组 a[ 0 ]的首地址,即 *a 与 a[ 0 ] 是同一个值。它的指针移动单位是“行”,所以 a + i 指向的是第 i 个行数组,即指向 a[ i ]。

当用 int *p;定义指针 p 时,p 的指向是一个 int 型数据,而不是一个地址,因此,用 a[ 0 ]对 p 赋值是正确的,而用 a 对 p 赋值是错误的。

另外,由上述说明,我们还可以得到二维数组元素的一种表示方法:
对于二维数组 a,其 a[ 0 ]数组由a指向,a[ 1 ]数组则由 a + 1指向,a[ 2 ]数组由 a + 2 指向,以此类推。因此,*a 与 a[ 0 ] 等价、*(a + 1) 与 a[ 1 ] 等价、*(a + 2) 与 a[ 2 ] 等价,┅,即对于 a[ i ] 数组,由 *(a + i) 指向。

由此,对于数组元素 a[ i ][ j ],用数组名 a 的表示形式为:*(*(a + i) + j)
指向该元素的指针为:*(a + i) + j
数组名虽然是数组的地址,但它和指向数组的指针变量不完全相同。指针变量的值可以改变,即它可以随时指向不同的数组或同类型变量,而数组名自它定义时起就确定下来,不能通过赋值的方式使该数组名指向另外一个数组。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-12-9 16:11:14 | 显示全部楼层
风过无痕1989 发表于 2020-12-8 17:20
二维数组元素和指针之间的对应关系:

例如,有如下定义:

谢谢老哥,但是还是不明白我循环里写的p=c怎么正确赋值的???虽然i++可他们不还是p和c没变。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-10 00:40:08 | 显示全部楼层
可以这么改,但函数那边,我还没有调试好主要是没有完全看明白,你定义的函数要干什么
int main()
{
        int i = 0;
        char c[10][10], (*p)[10];//数组指针p  
        while (i<10)
        {
                scanf_s("%s", c[i],10);
                i++;
        }
        p = c;
        for (i = 0;i < 10;i++)
        {
                p = p + i;
                sort(p);
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-10 11:06:17 | 显示全部楼层
本帖最后由 头发 于 2020-12-10 11:10 编辑
风过无痕1989 发表于 2020-12-10 00:40
可以这么改,但函数那边,我还没有调试好主要是没有完全看明白,你定义的函数要干什么


谢谢把数组的元素由小到大输出。我故意想用数组指针实现的  
原先p=c咋回事??没看出来他们咋变化的。结果竟然是对的???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-10 12:23:22 | 显示全部楼层
头发 发表于 2020-12-10 11:06
谢谢把数组的元素由小到大输出。我故意想用数组指针实现的  
原先p=c咋回事??没看出来他们咋变化的 ...

定义指针 (*p)[10],p = c 就是将行地址赋给指针,但由于你的指针定义的是 10 行,你原来的程序,却只是将首行 c 给它了,故而出错。

数组的元素由小到大输出,是全部的元素,还每一行都由小到大?(下面两种方式,用左边的排序还是右边的排序?)

  1  2   3   4   5   6  7   8   9                        1  3  5   7  8   9 10 13 15
10 11 12 13 14 15 16 17 18                        2  4  6 11 12 14 16 17 18
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-14 11:23:20 | 显示全部楼层
风过无痕1989 发表于 2020-12-10 12:23
定义指针 (*p)[10],p = c 就是将行地址赋给指针,但由于你的指针定义的是 10 行,你原来的程序,却只是 ...

我知道c的首地址,但i++不关p=c的事,但是他是对的, dev没出错,我迷了

左边的排序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 09:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表