c语言 名字是指针吗,C语言数组名与指针的区别及一个简单的冒泡排序

本文探讨了C语言中数组名作为函数参数时出现的问题。作者在实现冒泡排序时,由于将数组长度误通过sizeof运算求解,导致在函数内部获取的数组长度错误。通过查阅资料,作者了解到数组名在函数内部实际为普通指针,失去数组长度信息。为解决此问题,作者建议将数组长度作为额外参数传递给函数,修正后的代码能够正确实现冒泡排序并输出排序后的数组。文章强调了理解C语言中数组和指针关系的重要性。
摘要由CSDN通过智能技术生成

back.jpg

复习C这个老祖宗,写了个简单的冒泡排序,想实现将整型数组内的元素从小到大排列,结果出了点小问题。经查阅资料发现数组名这个东西还挺有意思的。

喵喵喵

问题复现

平时都是把数组名当作特殊的指针来用的,所以开始是这么写的。

int * maoPao(int *a);

int main()

{

int a[5] = {21,3,12,9,5};

int *p = maoPao(a);

printf("%d %d %d %d %d",p[0],p[1],p[2],p[3],p[4]);

}

int * maoPao(int *p)

{

int len = sizeof(p)/sizeof(p[0]);

printf("数组元素个数%d\r\n",len);

//冒泡排序

for(int i = 0;i < len - 1; i++)

{

int flag = 1;

for(int j = 0 ;j < len - 1 -i;j++)

{

if(p[j] > p[j+1])

{

int t = p[j];

p[j] = p[j+1];

p[j+1] = t;

flag = 0;

}

}

if(flag)

{

break;

}

}

//void也可以,因为操作的都是指针对应的内容,a数组的值已经变了。

return p;

}

运行结果:

数组元素个数2

3 21 12 9 5

这就不对了,数组元素明明是5个,怎么变成2个了呢?冒泡的结果也是不正确的。

之后依次尝试输出sizeof(p)与sizeof(p[0]),运行结果: 8 4

我一个数组,怎么就变成了一个普的指针变量了呢?

解决问题

经查,有言:数组名作为函数形参时,在函数体内,失去了本身的内涵,仅仅只是一个指针。同时它还失去了其常量特性,可以自增,自减等,可以被修改。

数组名本质的三个结论:

1、数组名的内涵在于其只带实体是一种数据结构,这种数据结构就是数组。

2、数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量。

3、指向数组的指针则是另外一种变量类型,指针变量,仅仅意味着数组的存放地址。

因此,这里通过sizeof相除得到数组元素个数的方法在main函数里正常,但若是通过形参传递到其他函数体里,这里的形参只是一个普通的指针变量,结果就不再正确了。

所以,将数组长度作为参数与数组一起传递给处理函数即可。

处理函数修改为:

int * maoPao(int *p,int arrLen)

{

int len = arrLen;

printf("数组元素个数%d\r\n",len);

//冒泡排序

for(int i = 0;i < len - 1; i++)

{

int flag = 1;

for(int j = 0 ;j < len - 1 -i;j++)

{

if(p[j] > p[j+1])

{

int t = p[j];

p[j] = p[j+1];

p[j+1] = t;

flag = 0;

}

}

if(flag)

{

break;

}

}

//void也可以,因为操作的都是指针对应的内容,a数组的值已经变了。

return p;

}

对应修改函数调用及声明即可。

运行结果:

数组元素个数5

3 5 9 12 21

平时用惯了java c#之类的,对c这个老祖宗倒是快忘的一干二净了。

引用资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值