精华内容
下载资源
问答
  • c语言函数传递数组_c语言函数数组地址传递没有输出
    千次阅读
    2021-05-21 13:44:19

    最佳答案

    数组只能通过指针传递,不能通过值传递。

    数组参数属于指针参数,指针参数即时传址参数(或叫引用参数), 如果想在函数中修改参数的值, 这是唯一的途径.

    如果把数组当作参数, 不管愿意与否, 它就是指针, 指向第一个值的指针.

    1. 数组参数就是指向第一个元素的指针: #include

    void getArr(int p[], int si);

    int main(void)

    {

    int ns[] = {1,2,3,4,5};

    getArr(ns, sizeof(ns)/sizeof(ns[0]));

    getchar();

    return 0;

    }

    void getArr(int p[], int si) {

    int i;

    for (i = 0; i < si; i++) {

    printf("%d\n", p[i]);

    }

    }

    2. 干脆直接声明为指针: #include

    void getArr(int *p, int si);

    int main(void)

    {

    int ns[] = {1,2,3,4,5};

    getArr(ns, sizeof(ns)/sizeof(ns[0]));

    getchar();

    return 0;

    }

    void getArr(int *p, int si) {

    int i;

    for (i = 0; i < si; i++) {

    printf("%d\n", p[i]);

    }

    }

    3. 即使你在形参中指定维数也不起作用: #include

    void getArr(int p[2], int si);

    int main(void)

    {

    int ns[] = {1,2,3,4,5};

    getArr(ns, sizeof(ns)/sizeof(ns[0]));

    getchar();

    return 0;

    }

    void getArr(int p[2], int si) {

    int i;

    for (i = 0; i < si; i++) {

    printf("%d\n", p[i]);

    }

    }

    4. 既然是指针, 其值就有被修改的可能: #include

    void getArr(int p[], int si);

    int main(void)

    {

    int ns[] = {1,2,3,4,5};

    size_t i;

    getArr(ns, sizeof(ns)/sizeof(ns[0]));

    for (i = 0; i < sizeof(ns)/sizeof(ns[0]); i++) {

    printf("%d\n", *(ns+i));

    }

    getchar();

    return 0;

    }

    void getArr(int p[], int si) {

    int i;

    for (i = 0; i < si; i++) {

    p[i]++;

    }

    }

    5. 如果是字符数组, 它自己能判断数组尾界: #include

    void getArr(char p[]);

    int main(void)

    {

    char ns[] = "ABCDEFG";

    getArr(ns);

    getchar();

    return 0;

    }

    void getArr(char p[]) {

    int i;

    for (i = 0; p[i]; i++) {

    printf("%c: %d\n", p[i], p[i]);

    }

    }

    最佳答案由网友  夺命薯条  提供

    更多相关内容
  • C语言 数组传递与值传递讲解

    千次阅读 2020-08-22 10:45:24
    在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译...因此在数组名作函数参数时所进行的传送只是地址的传送,也就是说把实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就等于有了实在

    在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元。在函数调用时发生的值传送是把实参变量的值赋予形参变量。在用数组名作函数参数时,不是进行值的传送,即不是把实参数组的每一个元素的值都赋予形参数组的各个元素。因为实际上形参数组并不存在,编译系统不为形参数组分配内存。那么,数据的传送是如何实现的呢?在我们曾介绍过,数组名就是数组的首地址。因此在数组名作函数参数时所进行的传送只是地址的传送,也就是说把实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。因此当形参数组发生变化时,实参数组也随之变化。

    在这里插入图片描述
    上图说明了这种情形。图中设a为实参数组,类型为整型。a占有以2000为首地址的一块内存区。b为形参数组名。当发生函数调用时,进行地址传送,把实参数组a的首地址传送给形参数组名b,于是b也取得该地址2000。于是a,b两数组共同占有以2000为首地址的一段连续内存单元。从图中还可以看出a和b下标相同的元素实际上也占相同的两个内存单元(整型数组每个元素占二字节)。例如a[0]和b[0]都占用2000和2001单元,当然a[0]等于b[0]。类推则有a[i]等于b[i]。
    多维数组也可以作为函数的参数。在函数定义时对形参数组可以指定每一维的长度,也可省去第一维的长度。因此,以下写法都是合法的:
    int MA(int a[3][10]);或int MA(int a[][10]);

    下面给出两个将数组传递进函数的例子:
    ex1:

    //求5名学生的平均成绩
    #include <stdio.h>
    
    float aver(float a[5])  //此处函数的定义中数组的元素个数可以省略,由传入的数组决定
    {
        int i;
        float av,s=a[0];
        for(i=1;i<5;i++)
            s=s+a[i];
        av=s/5;
        return av;
    }
    
    int main(void){
        float sco[5],av;
        int i;
        printf("\ninput 5 scores:\n");
        for(i=0;i<5;i++)
            scanf("%f",&sco[i]);
        av=aver(sco);  //此处将数组传递进函数时使用的是数组名称,没有括号
        printf("average score is %5.2f",av);
        return 0;
    }
    

    ex2:

    //将数组中小于0的元素置成0
    #include <stdio.h>
    void nzp(int a[8])
    {
        int i;
        printf("\nvalues of array are:\n");
        for(i=0;i<8;i++)
        {
            if(a[i]<0)
                a[i]=0;
            printf("%d ",a[i]);
        }
    }
    
    int main(void)
    {
        int b[5],i;
        printf("\ninput 5 numbers:\n");
        for(i=0;i<5;i++)
            scanf("%d",&b[i]);
        printf("initial values of array b are:\n");
        for(i=0;i<5;i++)
            printf("%d ",b[i]);
        nzp(b);  //将有5个元素的数组传递进一个有8个元素的数组的函数,编译通过
        printf("\nlast values of array b are:\n");
        for(i=0;i<5;i++)
            printf("%d ",b[i]);
        return 0;
    }
    
    展开全文
  • c语言数组传递

    千次阅读 2018-02-26 19:03:25
    转自:http://blog.csdn.net/xgmiao/article/details/9570825 点击打开链接数组作为函数实参:C语言数组作为函数实参时,编译器总是将其解析为指向数组首元素地址的指针(地址调用)原因:我们知道C语言函数的调用...

    转自:http://blog.csdn.net/xgmiao/article/details/9570825 点击打开链接

    数组作为函数实参:

    C语言中数组作为函数实参时,编译器总是将其解析为指向数组首元素地址的指针(地址调用)

    原因:我们知道C语言函数的调用有传值和传地址调用。假设C语言对数组采用传值调用(对实参作一份拷贝,传递给被调用函数,函数不能修改实际实参值,而只能改变其拷贝),然后如果拷贝整个数组,则在时间和空间上开销都非常大。而对于函数,只要知道实参数组的首元素的地址,照样可以访问整个数组,所以采用传址调用效率更高。

    注意的一点是对于函数来说,其接受的是数组首元素的地址,所以它是并不知道数组的大小的。

    一维数组作函数实参:

    [cpp]  view plain copy
    1. #include <stdio.h>  
    2.   
    3. void fun(char *p)  
    4. {  
    5.     printf("%d\n",sizeof(p));  
    6.     char c = p[3];  
    7. }  
    8.   
    9. void fun(char a[10])  
    10. {  
    11.     printf("%d\n",sizeof(a));  
    12.     char c = a[3];  
    13. }  
    14.   
    15. void fun(char a[])  
    16. {  
    17.     printf("%d\n",sizeof(a));  
    18.     char c = a[3];  
    19. }  
    20.   
    21. void main(int argc,char* argv[])  
    22. {  
    23.     char a[100] = "jhalfalsdfa1111";  
    24.     fun(a);  
    25.   
    26.     getchar();  
    27. }  

    以上三个函数为一维数组作为实参的函数常用的定义方式。三个函数输出的结果都是4,说明了传给函数就是一个地址,特别对于第二种定义,不要以为该函数只能接收大小为10的数组,实际实参数组的大小与函数形参数组的大小是没有任何关系的。最好采用第三种方式定义,因为第一种方式,我们也可以认为该函数的实参为指针,而第二种方式可能会误认为该函数只能接收大小为10的数组。

    二维数组作为函数实参:

    错误认识:既然一维数组作为参数相当与一个指针,那二维数组作为参数就相当于一个二级指针。

    正确认识:二维数组名作为参数时相当于一个数组指针(指向一维数组的指针)

    [cpp]  view plain copy
    1. #include <stdio.h>  
    2.   
    3. void fun(int a[4][3])  
    4. {  
    5.   
    6. }  
    7.   
    8. void fun(int (*p)[3])  
    9. {  
    10.       
    11. }  
    12.   
    13. void fun(int a[][3])  
    14. {  
    15.       
    16. }  
    17.   
    18. void main(int argc,char* argv[])  
    19. {  
    20.     int a[2][3] = {1,2,3,4,5,6};  
    21.     fun(a);  
    22. }  

    以上二维数组作为函数实参的函数常用的定义方式。函数定义中,数组第二维的数目必须要与实参第二维的数目一样,第一维的数目无所谓。因为二维数组名做实参时,编译器是将其解析为一个指向大小为第二维的数组的指针。

    展开全文
  • C语言数组当参数传递

    万次阅读 多人点赞 2018-01-29 19:57:23
    在学习C语言的过程中遇到数组作为参数传递的问题 一维数组:#include int test2(int a[]){ for(int i=0;i;i++){ printf("%d",a[i]); } } int main(){ int a[5] = {1,2,3,4,5},*p; p = a; test2(a); } ...

    在学习C语言的过程中遇到数组作为参数传递的问题

    一维数组:

    #include <stdio.h>
    
    int test2(int a[]){
    	for(int i=0;i<5;i++){
    		printf("%d",a[i]);
    	}
    }
    int main(){
    	int a[5] = {1,2,3,4,5},*p;
    	p = a;
    	test2(a);
    	
    }


    这样我们可以很顺利的在test去遍历这个数组a,当然我们还可能传递指针:

    int test1(int *p){
    	for(int i=0;i<5;i++){
    		printf("%d",p[i]);//我们在这里还可以用)*(p+i)来输出数组中的值
    	}	
    }
    
    int main(){
    	int a[5] = {1,2,3,4,5},*p;
    	p = a;
    	test1(p);
    	
    }


    一般来数参数的传递是值传递,也就是说实参传给形参,形参发生改变时实参并不会改变,(单向)但是数组在传递的时候是地址传递,只要形参发生了变化,实参也会发生变化(双向)。

    这样传递数组就会发现一个问题,我没有办法获取到数组的长度。获取数组的长度我们一般用:

    sizeof(a)/sizeof(int)

    int test2(int a[]){
    	int n = sizeof(a)/sizeof(int);
    	for(int i=0;i<n;i++){
    		printf("%d ",a[i]);
    		a[i]++;
    	}
    }
    我们会发现n的值一直是2!为什么会这样呢!?
    因为,a是函 数参数,到了本函数中,a只是一个指针(地址,系统在本函数运行时,是不知道a所表示的地址有多大的数据存储 空间,这里只是告诉函数:一个数据 空间首地址 ),所以,sizoef(a)的结果是指针变量a占内存的大小 ,一般在64位机上是8个字节。 int类型是4个字节,所以,结果永远是2, 因此 ,我们要向获取数组长度要怎么办呢?

    我可以在初始化数组的地方获取到数组的长度,作为参数传递过来:

    int test2(int a[],int n){
    	for(int i=0;i<n;i++){
    		printf("%d ",a[i]);
    		a[i]++;
    	}
    }
    
    int main(){
    	int a[5] = {1,2,3,4,5},*p;
    	int n = sizeof(a)/sizeof(int);
    	test2(a,n);
    
    	
    }

    这样做我们可以获取到数组的长度。

    二维数组:

    二维数组作为参数传递是后我们不可以像以为数组那样直接,如:

    void test1(int a[][]){
    	
    	for(i = 0; i < 5; i++){
    		for(j = 0; j < 5; j++){
    			printf("%d ",a[i][j]);
    		}
    	}
    }
    
    int main(){
    	int a[5][5],i,j;
    	for(i = 0; i < 5; i++){
    		for(j = 0; j < 5; j++){
    			a[i][j] = i*5 + (j +1);
    		}
    	}
    	test1(a);
    	return 0;	
    }

    会发现编译都编译不通过,报“[Error] declaration of 'a' as multidimensional array must have bounds for all dimensions except the first”这个错,意思是多维数组的定义必须有一个除第一个之外的所有维度的边界,比如:

    void test1(int a[][5]){
    	
    	for(int i = 0; i < 5; i++){
    		for(int j = 0; j < 5; j++){
    			printf("%d ",a[i][j]);
    		}
    	}
    }
    这样就OK了,但是我们是动态分配的数组不知道这个维度是多少的时候怎么办?这时候我们可以用指针当做一维数组来操作:
    void test1(int *p,int n){
    	for(int i = 0; i < n; i++){
    		printf("%d ",p[j]);
    	}
    }
    
    
    int main(){
    	int a[5][5],i,j;
    	int *p;
    	p = &a[0][0];
    	for(i = 0; i < 5; i++){
    		for(j = 0; j < 5; j++){
    			a[i][j] = i*5 + (j +1);
    		}
    	}
    	test1(p,25);
    	return 0;	
    }


    这样我们发现不能更灵活的去定位到某一行某一列,这样我们需要手工改变寻址方式:
    void test2(int  m,int  n,int **p){//m,n是行和列,
    	for(int i = 0; i < m; i++){
    		for(int j = 0; j < n; j++){
    			printf("%d ",*((int *)p+n*i+j));
    		}
    	}
    }
    
    int main(){
    	int a[5][5],i,j;
    	
    	for(i = 0; i < 5; i++){
    		for(j = 0; j < 5; j++){
    			a[i][j] = i*5 + (j +1);
    		}
    	}
    	test2(5,5,(int **)a);
    	return 0;	
    }







    展开全文
  • C语言数组在函数中的传参

    千次阅读 2021-03-25 22:34:58
    c语言中有时需要数组作为函数的参数进行传参,那么应该怎样传递呢? 先看一下整数作为函数参数时的传参 #include <stdio.h> #include <stdlib.h> int Add(int a,int b) { int c; c = a + b; ...
  • C语言多维数组地址

    2021-05-22 12:43:14
    设有整型二维数组a[3][4]如下:0 1 2 34 5 6 78 9 10 11它的定义为:int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}设数组a的首地址为1000,各下标变量的首地址及其值如图所示。前面介绍过,C语言允许把一个二维...
  • c语言数组

    2021-05-14 11:43:47
    1、C语言规定,数组名代表数组的首地址,也就是第0号元素的地址,所以a==&a[0]。 2、但对数组名取地址时却要注意了,在理解“对数组名取地址”这一表达式的含义时一定要记住:数组名是“数组”这种变量的名,...
  • C语言函数传数组地址参数

    千次阅读 2018-12-20 17:08:56
    main()函数里写成ReadReg(Addr...buf[i]前需加取地址符&amp; #include "stdio.h" int i; int Addr;, int buf[16] = {0}; int ReadReg(int a, int * b) { ... ... } void main() { Addr = 0...
  • C语言数组参数传递问题

    千次阅读 2019-04-28 10:36:37
    数组传递参数的话,如果直接传指针过去。对数组参数的操作会改变原始变量的值。如果不想影响原始变量的话,需要在函数里面定义新的局部数组变量。赋值给局部数组变量,对局部数组变量进行操作。 #include <...
  • C语言数组总结与反思

    2021-05-20 10:53:45
    二维数组等,要注意数组的下标都是从0开始的,在做题时还要注意定义数组的大小,数组过小,在程序中会造成越界导致崩溃(多次崩溃深有体触),二维数组注意第二维度的长度绝对不能省略,若要把一个数组传递给一个函数...
  • 在Python语言中,可以使用ctypes模块调用其它如C++语言编写的动态链接库DLL文件中的函数,在提高软件运行效率的同时,也...前面两篇已经讲了传递数值/指针/字符串参数、传递结构体参数的例子,大家可以回看一下,...
  • C语言数组的概念

    2021-05-22 17:23:55
    在《C语言数据输出大汇总以及轻量进阶》一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下:#include #include int main(){int a1=20, a2=345, a3=700, a4=22;int b1=56720, b2=9999, b3=20098, b4=2;...
  • C语言数组长度详解

    2022-01-30 16:05:21
    【!求三连!】 ...运行发现sizeof(arr)作为实参传递使用时无法计算arr的总字节 只有arr数组写在运用sizeof(arr)同一函数中的直接使用才能计算 解决方法,自创数组长度函数,调用求解. ...
  • 如果想要在函数中传递一个一维数组作为参数,您必须以下面三种方式来声明函数形式参数,这三种声明方式的结果是一样的,因为每种方式都会告诉编译器将要接收一个整型指针。同样地,您也可以传递一个多维数组作为形式...
  • C语言数组参数与指针参数我们都知道参数分为形参和实参。形参是指声明或定义函数时的参数,而实参是在调用函数时主调函数传递过来的实际值。一、一维数组参数1、能否向函数传递一个数组?看例子:void fun(char a[10...
  • c语言数组形参

    2020-06-16 19:57:47
    c语言中,如果数组作为参数传递,会退化为指针。 void testPara(int nums[]) { int len = sizeof(nums) / sizeof(int); printf("形参数组长度为%d\n", len); } int main() { int nums[] = {1,2,3,4,5}; int ...
  • 数组基本知识点:1,数组初始化,命名2.数组大小,数组类型3.数组访问方法4.字符数组5.数组下标越界6.数组作为函数参数问题7.二维数组基本概念以及多维数组以后还会有关于指针数组问题#define _CRT_SECURE_NO_...
  • C语言数组

    千次阅读 2021-05-21 09:59:51
    数组的基本概念数组就是一个可以一次性定义多个相同类型的变量,并可以放到一个连续的内存中去。初始化只有在定义的时候顺便赋值才叫初始化。int a = 1024 ; int arr[5] = {1,2,3,4,5}; // 完全初始化int arr1[] = {...
  • 这篇文章主要介绍了C语言数组入门之数组的声明与二维数组的模拟,数组学习的同时也要相应理解C语言指针的作用,需要的朋友可以参考下
  • C语言数组引用

    千次阅读 2018-05-01 14:05:07
    在C语言中使用数组必须先定义一维数组的定义方式为: 类型说明符 数组名 [常量表达式];int arr[] = {1,2,3,4,5,6};一维数组元素的引用:数组元素的一般形式为:数组名[下标](下标从0开始)printf("%d\n&...
  • 以上面的例子为例,我们一般给函数传一个数组参数,按照上面编写代码是绝对没错的,但是,我们编译器,我们的C语言真的是将整个数组传递过去给函数了吗? 如果将代码改为: 但是输出的结果却是: 证明了并...
  • 学习笔记中的内容多少会有一点文不对题,因为C语言数组无法作为函数的一个传递参数。而数组名在作为函数传递参数使用的时候实际上也被转换成了一个指针。 编写如下代码; #include"stdio.h"   char hello[] =...
  • 一、传递普通参数,直接传入即可 void arrprint(int arr){ printf("%d\n",arr);...二、传递数组的时候,需要将数组的长度也传入进去,否则只能传递一个第一个值 void arrprint(int* arr,int len){ f
  • C语言传递地址传递

    千次阅读 2021-07-14 20:36:33
    二、C语言函数的地址传递 三、局部变量作为函数返回值 #include <stdio.h> char *fun(void) { static char buf[] = "helo world!";//这里有没有static会影响输出结果,加上static相当于数据存储在数据区 ...
  • C语言数组
  • C语言中,数组名作为参数传递给函数时,退化为指针,sizeof对指针操作结果应该是4。例子如下:#includeusing namespace std;void Swap_arr(char* charArr){int len = sizeof(charArr);cout << "len =" <<...
  • C语言数组作为函数参数

    万次阅读 多人点赞 2019-02-24 20:24:59
    数组元素就是变量,与普通变量没有区别,将数组元素传送给形参,实现单向的值传递。 #include &lt;stdio.h&gt; float max(float x,float y){ if(x &gt; y) return x; else return y; } int main()...
  • 1功能输入 6 个学生的 5 门课程成绩计算出每个学生的平均分和每门课程的平均 分 2C 语言实现代码 其实就是用二维数组来实现的 二维数组的引用传递使用数组指 针来完成 复制代码 代码如下 : #include <stdio.h>...
  • C语言 数组类型 详细总结

    万次阅读 2019-05-08 22:31:42
    register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数。 extern:指定对应变量为外部变量,即在另外的目标文件中定义,可以认为是约定...
  • c语言数组怎么传递到函数里面

    千次阅读 2021-05-20 18:56:34
    作者个人认为,一个程序员想要走的多远,就应该有多深的基础,这次我小小的分享一个小知识点,也就是数组传递到函数要怎么传递 很多人都会遇到这样的函数 比如 int s[4]; find(s,5); 其实这就只是把第一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 99,508
精华内容 39,803
关键字:

c语言数组的地址传递

友情链接: JFILES.tar.gz