数组指针错误
#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;
} char c, (*p);
p = &c;
你这样定义试试,由于你是要输入十个字符串,我调试节两次,太烦人,每次100个字符呀 风过无痕1989 发表于 2020-12-4 17:29
char c, (*p);
p = &c;
多谢老哥!!错误那句原先是p=c
不知道咋回事就成p=c了,而且就对了????啥原理 i++跟p=c啥关系呀 风过无痕1989 发表于 2020-12-4 17:29
char c, (*p);
p = &c;
p【i】=c【i】 英文的总动消除??? 头发 发表于 2020-12-4 20:15
多谢老哥!!错误那句原先是p=c
不知道咋回事就成p=c了,而且就对了????啥原理 i++跟p=c啥关系呀
你定义的指针是 (*p),若是直接p = c 就会出现左侧右侧不匹配的错误,所以,将行地址赋给指针,就解决这个问题 风过无痕1989 发表于 2020-12-4 20:43
你定义的指针是 (*p),若是直接p = c 就会出现左侧右侧不匹配的错误,所以,将行地址赋给指针,就 ...
p【i】=c【i】 英文的总动消除??? 老哥请看这句
改成p=c后就对了 没加p=&a【10】 头发 发表于 2020-12-4 20:50
p【i】=c【i】 英文的总动消除??? 老哥请看这句
改成p=c后就对了 没加p=&a【10】
改成 p = c,我的 VS2015 警告错误呀 风过无痕1989 发表于 2020-12-6 16:11
改成 p = c,我的 VS2015 警告错误呀
我的能运行成功呀,啥原理老哥 风过无痕1989 发表于 2020-12-6 16:11
改成 p = c,我的 VS2015 警告错误呀
i变化 关p和c啥事 头发 发表于 2020-12-8 16:32
我的能运行成功呀,啥原理老哥
你用什么编译器? 头发 发表于 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
数组名虽然是数组的地址,但它和指向数组的指针变量不完全相同。指针变量的值可以改变,即它可以随时指向不同的数组或同类型变量,而数组名自它定义时起就确定下来,不能通过赋值的方式使该数组名指向另外一个数组。
风过无痕1989 发表于 2020-12-8 17:20
二维数组元素和指针之间的对应关系:
例如,有如下定义:
谢谢老哥,但是还是不明白我循环里写的p=c怎么正确赋值的???虽然i++可他们不还是p和c没变。 可以这么改,但函数那边,我还没有调试好主要是没有完全看明白,你定义的函数要干什么
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:10 编辑
风过无痕1989 发表于 2020-12-10 00:40
可以这么改,但函数那边,我还没有调试好主要是没有完全看明白,你定义的函数要干什么
谢谢把数组的元素由小到大输出。我故意想用数组指针实现的
原先p=c咋回事??没看出来他们咋变化的。结果竟然是对的??? 头发 发表于 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 风过无痕1989 发表于 2020-12-10 12:23
定义指针 (*p),p = c 就是将行地址赋给指针,但由于你的指针定义的是 10 行,你原来的程序,却只是 ...
我知道c的首地址,但i++不关p=c的事,但是他是对的, dev没出错,我迷了
左边的排序
页:
[1]