如何在C语言中以数组指针作为形参输出数组

2025-02-26 07:10:27
推荐回答(5个)
回答1:

数组 与 普通指针 的区别:
1、指针的本质是一个与地址相关的复合类型,它的值是数据存放的位置(地址);数组的本质则是一系列的变量。
2、数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是"可变",所以我们常用指针来操作动态内存。
3、当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。 

因为第三条,当把数组名作为函数的形参进行传递时,该效果等同于传递一个同类型的指针。直接在程序当中调用 函数名(数组名)即可。

例程:

#include
int a[]={1,2,3,4,5,6};
void print(int a[]){//数组指针作为形参
    for(i=0;i<6;i++) printf("%d ",a[i]);//输出数组
}
int main(){
    print(a);//传入数组名
    return 0;
}

回答2:

//#include "stdafx.h"

#include "stdio.h"
void  cmdsend(unsigned int * info);
int main()
{  
unsigned int senddata[6];
senddata[0] = 8;
senddata[1] = 2;
senddata[2] = 0;
senddata[3] =4;
senddata[4] =5;
senddata[5]='\0';
cmdsend( senddata, 5 );

while(1){;}
}

void  cmdsend(unsigned int * info, unsigned len)
{
    unsigned int k;
    //for (k = 0; ((*info) != '\0')&& (info != NULL); *info++,k++)

      for (k = 0; k < len; info++,k++)
        printf("senddata is %d\r\n",*info);
}

你自己也发现了senddata[2]就是0和你指定'\0'都是ASCII 0,还有三个地方要注意,

  1. 就是你的形参指针info, 你使用的是*info ++(这意思是指针你数组元素值在递增,可是你要的不是地址值递增吗,应该是info ++)

  2. for循环中你所写的((*info) != '\0')&& (info != NULL), 你的*info在sendata[2]就为0了,并且也确实info != NULL, 退出条件都为真,所以你还是照样输出到senddata[2]便退出了,所以建议像以上修改,再传递一个数组(即线性表)长度进来,便可以解决这个问题;还有一个办法,除非你数组里的元素不为数字,而是数符,如下

    senddata[0] = '8'; //ASCII 0x38
    senddata[1] = '2'; //ASCII 0x32
    senddata[2] = '0'; //ASCII 0x30(不是ASCII 0)
    senddata[3] ='4'; //ASCII 0x34
    senddata[4] ='5'; //ASCII 0x35
    senddata[5]='\0';

    并且你cmdsend函数中,printf("senddata is %c\r\n",*info);即可

  3. stdafx.h这个是哪个头文件,你是不是想用stdio.h??

回答3:

senddata[2]=0,0和'\0'都等于0,因此(*info) != '\0'会在k=2时不成立

建议:1.另外传一个参数表示命令的长度;2 另外寻找一个一定不会在正常的命令中出现的数字作为结束符而不是正常命令中间就可能出现的0
另外有一个优化建议是吧info!=NULL的判断提前做而不是和for搅在一起,因为info本身的值在循环中是不断加1的,不太可能加来加去溢出到0。。而且更新语句不需要写*info++ 写info++就可以了

回答4:

用那个字符串命令 strlen 命令算出数组长度,for循环,按个数输出

回答5:

#include "stdafx.h"
void cmdsend(unsigned int * info);
int main()
{

unsigned int senddata[6];
senddata[0] = 8;
senddata[1] = 2;
senddata[2] = 0;
senddata[3] = 4;
senddata[4] = 5;
senddata[5] = -1;
cmdsend( senddata );
while(1){;}

}
void cmdsend(unsigned int * info)
{
unsigned int k;
for (k = 0; (int)*info>=0; info++, k++)
printf("senddata is %d\r\n", *info);
}