头发 发表于 2020-12-4 15:44:10

数组指针错误

#include<stdio.h>
#include<string.h>
void sort(char (*c))
{
        int i,j;
        char b;
        for(i=0;i<10;i++)
        {
                for(j=0;j<10-1-i;j++)
                {
                        if(strcmp(c,c)>0)
                        {
                                strcpy(b,c);
                                strcpy(c,c);
                                strcpy(c,b);
                        }
                }
        }
        for(i=0;i<10;i++)
        {
                printf("%s ",c);
        }
}
int main()
{
        int i=0;
        char c,(*p);//数组指针p
        while(i<10)
        {
                scanf("%s",&c);
                i++;
        }
        for(i=0;i<10;i++)
        {
                p=c; //这一行出错了 说我指针分配无效,怎么改呀
        }
        sort(p);
        return 0;
}

风过无痕1989 发表于 2020-12-4 17:29:12

char c, (*p);
p = &c;

你这样定义试试,由于你是要输入十个字符串,我调试节两次,太烦人,每次100个字符呀

头发 发表于 2020-12-4 20:15:59

风过无痕1989 发表于 2020-12-4 17:29
char c, (*p);
p = &c;



多谢老哥!!错误那句原先是p=c
不知道咋回事就成p=c了,而且就对了????啥原理 i++跟p=c啥关系呀

头发 发表于 2020-12-4 20:16:46

风过无痕1989 发表于 2020-12-4 17:29
char c, (*p);
p = &c;



p【i】=c【i】 英文的总动消除???

风过无痕1989 发表于 2020-12-4 20:43:20

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

你定义的指针是 (*p),若是直接p = c 就会出现左侧右侧不匹配的错误,所以,将行地址赋给指针,就解决这个问题

头发 发表于 2020-12-4 20:50:54

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

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

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

风过无痕1989 发表于 2020-12-6 16:11:37

头发 发表于 2020-12-4 20:50
p【i】=c【i】 英文的总动消除??? 老哥请看这句

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

改成 p = c,我的 VS2015 警告错误呀

头发 发表于 2020-12-8 16:32:39

风过无痕1989 发表于 2020-12-6 16:11
改成 p = c,我的 VS2015 警告错误呀

我的能运行成功呀,啥原理老哥

头发 发表于 2020-12-8 16:33:11

风过无痕1989 发表于 2020-12-6 16:11
改成 p = c,我的 VS2015 警告错误呀

i变化 关p和c啥事

风过无痕1989 发表于 2020-12-8 17:06:15

头发 发表于 2020-12-8 16:32
我的能运行成功呀,啥原理老哥

你用什么编译器?

风过无痕1989 发表于 2020-12-8 17:20:09

头发 发表于 2020-12-8 16:33
i变化 关p和c啥事

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

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

对上述二维数组 a,虽然 a 、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
数组名虽然是数组的地址,但它和指向数组的指针变量不完全相同。指针变量的值可以改变,即它可以随时指向不同的数组或同类型变量,而数组名自它定义时起就确定下来,不能通过赋值的方式使该数组名指向另外一个数组。

头发 发表于 2020-12-9 16:11:14

风过无痕1989 发表于 2020-12-8 17:20
二维数组元素和指针之间的对应关系:

例如,有如下定义:


谢谢老哥,但是还是不明白我循环里写的p=c怎么正确赋值的???虽然i++可他们不还是p和c没变。

风过无痕1989 发表于 2020-12-10 00:40:08

可以这么改,但函数那边,我还没有调试好主要是没有完全看明白,你定义的函数要干什么
int main()
{
        int i = 0;
        char c, (*p);//数组指针p
        while (i<10)
        {
                scanf_s("%s", c,10);
                i++;
        }
        p = c;
        for (i = 0;i < 10;i++)
        {
                p = p + i;
                sort(p);
        }
        return 0;
}

头发 发表于 2020-12-10 11:06:17

本帖最后由 头发 于 2020-12-10 11:10 编辑

风过无痕1989 发表于 2020-12-10 00:40
可以这么改,但函数那边,我还没有调试好主要是没有完全看明白,你定义的函数要干什么

谢谢把数组的元素由小到大输出。我故意想用数组指针实现的
原先p=c咋回事??没看出来他们咋变化的。结果竟然是对的???

风过无痕1989 发表于 2020-12-10 12:23:22

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

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

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

12   3   4   5   67   8   9                        135   78   9 10 13 15
10 11 12 13 14 15 16 17 18                        246 11 12 14 16 17 18

头发 发表于 2020-12-14 11:23:20

风过无痕1989 发表于 2020-12-10 12:23
定义指针 (*p),p = c 就是将行地址赋给指针,但由于你的指针定义的是 10 行,你原来的程序,却只是 ...

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

左边的排序
页: [1]
查看完整版本: 数组指针错误