一群菜鸟不懂的乱说。
我把楼主的代码改了一些,如下
#include<stdio.h>
int input(int data[], int argc, int *n) { int i; printf("请输入要输入数的个数"); scanf("%d", n); if(*n > argc) { printf("segment fault!"); return -1; } for(i = 0; i < *n; i++) { printf("输入的第%d个数.", i+1); scanf("%d", data+i); //canf("%d", &data[i]); } printf("输入的数是: "); for(i = 0; i < *n; i++) { printf("%5d ", data[i]); } return 0; }
void sort(int n, int data[]) { int i, j, temp; for(i = 0; i < n-1; i++) { for(j = i+1; j < n; j++) if(data[i] < data[j]) { temp = data[i]; data[i] = data[j]; data[j] = temp; } } printf("排序后的结果如下: "); for(i = 0; i < n; i++) printf("%5d ", data[i]); }
int main() { int data[100]; int n; if(input(data, 100, &n) == -1) return -1; sort(n, data); return 0; }
对于以上代码,做出如下解释:
(1)C语言的参数有形参和实参的说法,形参在传递到函数内的时候,复制一个副本给函数,在函数内部和外部是两个完全不同的变量,函数结束,空间也被释放,所以不能在函数内部来改变外部的值。
所以要像楼主这样用一个函数给一个变量赋值,要用实参int input(int data[], int argc, int *n)中的int *n就是实现形式,这种办法把n的地址传递给函数。
当然,在调用函数的时候也同样要传递地址指针类型(&n)。
(2)
if(*n > argc) { printf("segment fault!"); return -1; }
这一段是我加进去的,因为按照楼主的意思,data数组的长度也要传递进去,但是意思何在?所以只好加了这一段,并把函数改为有类型的,以检验是否有数据溢出。
(3)scanf("%d", data+i); //scanf("%d", &data[i]);
这里我改动的主要原因是为了提升程序速度,scanf("%d", &data[i]);同样可以运行,但是寻址一次,又回头要地址,这样绕了一圈,没有必要。
对于楼主提几点建议:
(1)C语言的精髓在于指针,刚才说到的实参,就是用指针的概念实现的。
scanf("%d", data+i); 一行,同样也是把数组头指针加上偏移地址,得到所要的地址。
(2)C语言编程的时候特别要注意数据的溢出,这是所有初学者头疼的问题之一。
建议在一开始就养成习惯,经常检验数组的边界。
(3)void main一看就知道是看潭浩强的书长大的程序员。
建议我们都用int main(){ return 0; }的形式,可以看看C语言之父K&R的书。
主函数的返回值是告诉操作系统,这个函数是正常退出(返回0),还是异常退出(非0,经常是-1)。
(4)在做实际项目的时候,程序经常是要回头看的,也经常是要给别人看以达到维护的目的的。
除了要养成良好的文档书写习惯以外(学习软件工程以后你就会掌握),还要养成良好的编程风格,这里我建议看《thinking in C++》,并按照里面例题的风格,养成自己的习惯。
我们在去年12月分享过Hosteons新上AMD Ryzen9 3900X CPU及DDR4内存、NVMe硬盘的高性能VPS产品的消息,目前商家再次发布了产品更新信息,暂停新开100M带宽KVM套餐,新订单转而升级为新的Budget KVM VPS(SSD)系列,带宽为1Gbps端口,且配置大幅升级,目前100M带宽仅保留OpenVZ架构产品可新订购,所有原有主机不变,用户一直续费一直可用。Bud...
ucloud美国云服务器怎么样?ucloud是国内知名云计算品牌服务商家,目前推出全球多地机房的海外云服务器。UCloud主打的优势是海外多机房,目前正在进行的2021全球大促活动参与促销的云服务器机房就多达18个。UCloud新一代旗舰产品快杰云服务器已上线洛杉矶节点,覆盖北美和亚太地区,火热促销中, 首月低至7元,轻松体验具备优秀性能与极高性价比的快杰云服务器。点击进入:ucloud美国洛杉矶...
4324云是成立于2012年的老牌商家,主要经营国内服务器资源,是目前国内实力很强的商家,从价格上就可以看出来商家实力,这次商家给大家带来了全网最便宜的物理服务器。只能说用叹为观止形容。官网地址 点击进入由于是活动套餐 本款产品需要联系QQ客服 购买 QQ 800083597 QQ 2772347271CPU内存硬盘带宽IP防御价格e5 2630 12核16GBSSD 500GB30M1个IP...