精华内容
下载资源
问答
  • 众所周知,函数在传参数会复制参数,但传指针,只是复制了指针本身,而没有复制指针指向的值,所以可以通过传指针或引用来使函数内可以修改外部的值。那么,对于数组,会怎样? 上测试程序 #include<...

    众所周知,函数在传参数时会复制参数,但传指针时,只是复制了指针本身,而没有复制指针指向的值,所以可以通过传指针或引用来使函数内可以修改外部的值。那么,对于数组,会怎样?

    上测试程序

    #include<iostream>
    #include<typeinfo>
    using namespace std;
    
    void func(int arr[]){
        arr[0]=1;
        
        cout<<"type of arr in func : "<<typeid(arr).name()<<endl;
        cout<<"address of arr in func : "<<arr<<endl;
    }
    
    int main(){
        int arr[10];
        arr[0]=0;
        
        func(arr);
        
        cout<<arr[0]<<endl;
        cout<<"type of arr outside : "<<typeid(arr).name()<<endl;
        cout<<"address of arr outside : "<<arr<<endl;
        return 0;
    }

    这段程序定义了一个参数为int数组并修改了这个数组索引为0处的值为1的函数,在主函数中调用了它,并打印相关的信息。

    输出:

    type of arr in func : Pi
    address of arr in func : 0x7ffd09a12cb0
    1
    type of arr outside : A10_i
    address of arr outside : 0x7ffd09a12cb0
    
    按回车键返回
    

    从输出可以看出,在主函数中,arr的类型为A10_i,即大小为10的 int 数组;而在func函数中,arr的类型为Pi,即 int 指针。这说明了,在函数传参数时,将数组转化为了对应的指针。arr的首地址都是0x7ffd09a12cb0,并且func函数中修改的arr[0]的值成功的影响到了主函数中的arr,这也说明了,函数参数传数组时并没有复制数组,而是传了数组首地址对应的指针。

    展开全文
  • 案例1:普通变量作为函数的参数(函数内部修改不了函数外部的值) 案例2:指针变量作为函数的形参 知识点4:数组名作为函数的参数 知识点5:字符数组名作为函数的参数 知识点7:字符串指针变量 与 字符数组的...

    目录

    知识点1:多文件编程

    知识点2:二级指针

    知识点3:指针作为函数的参数

    案例1:普通变量作为函数的参数(函数内部修改不了函数外部的值)

    案例2:指针变量作为函数的形参

    知识点4:数组名作为函数的参数

    知识点5:字符数组名作为函数的参数

    知识点7:字符串指针变量 与 字符数组的区别

    知识点8:字符指针数组


    知识点1:多文件编程

    指针数组: 本质是数组只是每个元素的类型是指针

     

    知识点2:二级指针

     

    知识点3:指针作为函数的参数

    • 案例1:普通变量作为函数的参数(函数内部修改不了函数外部的值)

    • 案例2:指针变量作为函数的形参

     

    知识点4:数组名作为函数的参数

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void myinputarray(int *arr, int n)
    {
    	printf("请输入%d个int数据:", n);
    	for (size_t i = 0; i < n; i++)
    	{
    		scanf("%d", arr + i);
    	}
    }
    
    void mymaxint(int *arr, int n, int *p_max)
    {
    	int tmp_max = 0;
    	for (size_t i = 0; i < n; i++)
    	{
    		if (tmp_max < arr[i])
    		{
    			tmp_max = arr[i];
    		}
    	}
    	*p_max = tmp_max;
    }
    
    void myprintintarray(int *arr, int n)
    {
    	printf("数组总大小:%d\n", sizeof(arr));
    	for (size_t i = 0; i < n; i++)
    	{
    		printf("%d ", arr[i]);
    	}
    	printf("\n");
    }
    
    
    void test()
    {
    	int arr[5] = { 0 };
    	int n = sizeof(arr) / sizeof(arr[0]);
    
    	//定义函数:给arr元素获取键盘输入
    	myinputarray(arr, n);
    
    	int max = 0;
    	//定义函数:求最大值
    	mymaxint(arr, n, &max);
    	printf("max=%d\n", max);
    
    	//遍历
    	myprintintarray(arr, n);
    }
    
    int main(int argc, char *argv[])
    {
    	test();
    	system("pause");
    	return 0;
    }

     

    知识点5:字符数组名作为函数的参数

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void myinputchararray(char *arr, int n)
    {
    	printf("请输入一个字符串,长度小于%d\n", n);
    	fgets(arr, n, stdin);
    }
    
    int mystrlen(char *arr)
    {
    	int count = 0;
    	while (arr[count] != '\0')
    	{
    		count++;
    	}
    	return count;
    }
    
    void mychange(char *arr)
    {
    	int i = 0;
    	while (arr[i] != '\0')
    	{
    		if (arr[i]>='a' && arr[i]<='z')
    		{
    			arr[i] -= 'a' - 'A';
    		}
    		else if (arr[i] >= 'A' && arr[i] <= 'Z')
    		{
    			arr[i] += 'a' - 'A';
    		}
    		i++;
    	}
    }
    
    
    
    
    void test()
    {
    	char buf[32] = "";
    	//给buf获取键盘输入
    	myinputchararray(buf, sizeof(buf));
    	buf[strlen(buf) - 1] = 0;
    	printf("buf = %s\n", buf);
    
    	//获取字符串的实际长度(遇到\0结束)
    	int len = 0;
    	len = mystrlen(buf);
    	printf("len=%d\n", len);
    
    	//将buf大写字符变小写,小写字符变大写
    	mychange(buf);
    	printf("buf=%s\n", buf);
    }
    
    
    int main(int argc, char *argv[])
    {
    	test();
    	system("pause");
    	return 0;
    }

     

    知识点7:字符串指针变量 与 字符数组的区别

     

    知识点8:字符指针数组

     

     

     

     

     

    展开全文
  • 在函数中求数组长度?no,you can't

    千次阅读 2015-02-06 11:03:01
    近来写程序的时候遇到了一个问题,就是传递一个数组指针进入一个函数的时候,虽然指针能够顺利的传递,但是,我们无法求出该数组的大小。见下面的代码: #include stdio.h> void setNum(int *p,int a); ...
    
    C语言中可以求任意一个int型数组的长度吗? 近来在写程序的时候遇到了一个问题,就是传递一个数组指针进入一个函数的时候,虽然指针能够顺利的传递,但是,我们无法求出该数组的大小。见下面的代码:
    #include <stdio.h>
    void setNum(int *p,int a);
    void setNum(int *p);

    int main()
    {
        
    int a[] = {1,2,4,5};
        printf(
    "%d\n",sizeof(a)/sizeof(a[0]));
        setNum(a);
    }


    void setNum(int *p,int a)
    {
        
    *= a;
    }


    void setNum(int *p)
    {

        
    int Num = sizeof(p)/sizeof(p[0]);
        printf(
    "%d\n",Num);
    }
    结果是,输出分别是4和1.

    原因分析:
    1.对于第一个输出,由于在main函数中定义的为数组,所以可以直接利用sizeof函数来求出a数组的长度。
    2.对于传递参数类型,比如上面的setNum函数(未传递个数版本),此时,调用该函数的时候,a退化为一个普通的指针,也就是说,此时sizeof(p)求出来的就是一个指针的大小,除以int的大小,恰好为1.

    启示:
    C语言中,不能够根据一个数组指针就求出来任意一个数组的大小。解决办法就是传第一个参数进来,指定大小。

    ps:参考资料(详实):http://topic.csdn.net/t/20060205/18/4540750.html

    摘录:
    >   如果作为函数的参数是没法求的, 
    >   但这样是可以的: 
    >   
    >   #define   LENGTH(s)   (sizeof(s)   /   sizeof(int)) 
    >   
    >   int   s[12]; 
    >   int   length   =   LENGTH(s); 
    ================================================== 
    这样的方法只能用于数组变量的数组名,对于指向数组的指针,以及作为参数的数组名都是没有效果的,上面已经有人解释了 
    》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
    不可能有办法的。 
    当你定义一个数组的时候: 
    int   a[]   =   {1,   2,   3};     //   实际上被编译为   int   a[3]   =   {1,2,3} 

    数组名代表的是数组的地址。注意   ——   你绝对没有办法通过数组名动态获得数组的大小。当你丢失a的长度信息的时候,你永远不可能知道他的长度。 

    那么   sizeof   是怎么回事呢?他不是通过   a   的名字获得   a的大小了么?   ——   大错特错! 

    关键字   sizeof   产生的是一个编译期常量(注1)   他的运作方式是这样的: 

    当你写: 
    sizeof   a   
    实质是: 
    sizeof   (   a的类型   ) 

    而a的类型是什么呢?编译器察看   a的定义发现,   是   int   [3] 
    就是说,这里   sizeof   a   实质是: 
    sizeof   (   int[3]   ) 
    完全等同于常量   12   (假定int为4字节)。 


    考虑一个函数 
    void   func(   int   a[]   );     
    //   写成   int   a[3]   也不会有本质区别——也许你该试试写成   int   (&a)   [3]   ? 

    C++规定,数组作为形参的时候,a代表数组首地址。 
    他的底层意义是:   a   退化为了一个4字节的指针,没有任何变量表示数组的大小会“自动”被传递进来。 

    我们看看这个时候   sizeof   a是什么: 
    sizeof(   函数形参的a[]   )     =   sizeof(   int*   const   )   =   4     //   当然a[]不是合法的C++类型 


    仍然不服气?好——我们反问一个问题:若你是C   /C++的设计者,   你怎么在兼容原有设计的基础上让void   func(   int   a[]   )同时传递地址和大小? 

    首先,a是一个变量,而且类似数组。他必须是一个地址,否则你不知道如何索引元素。 
    他怎么再带上一个变量表示他的大小呢? 

    扩充   sizeof   (a)   的能力? 

    sizeof   a   必须产生代码——不管是常量还是什么。   要让他在运行时决定   a的值,   a就必须带上他的大小信息。   

    1   你必须修改C标准,让C支持“两种”数组。一种是定义处的数组,他分配大片连续内存,和原来的C标准相同。 

    2   另一种是作为参数传递数组。   你必须传递地址和数组大小;这个数组实际上是一个8字节的结构{   地址;   大小}(事实上可能更加复杂,考虑多纬数组如何实现?   )   

    3   系统必须根据两种不同数组分别实现其   []、*   、&等。   原有的数组根据其首地址偏移(这是个常量)和下标寻址;   而参数数组则首先取“地址”内容(这是个变量),然后根据这个地址寻址.... 

    厄...   再考虑多维数组——听起来这不是一整套vector模型么? 

    ----------------------------------------------- 
    注1:   对于C99支持的   flexible   array   ,其   sizeof   运算是运行时求值

    展开全文
  • 声明函数时的格式:functin 返回值类型 函数名 ([ref]类型 参数名[],...)library 函数库说明调用前:类型 数组名[]//必须定义成可变长度数组.....数组赋值.....//调用函数名(数组名,....)//也可以用“函数名(数组名...

    声明函数时的格式:

    functin 返回值类型 函数名 ([ref]类型 参数名[],...)library '函数库说明'

    调用前:

    类型 数组名[]//必须定义成可变长度数组

    .....数组赋值.....

    //调用

    函数名(数组名,....)//也可以用“函数名(数组名[],....)”

     

    展开全文
  • 大家都知道,Go 语言中,数组是分配连续内存的,也就是说,在函数中传递一个大数组,代价是很高的,例如: ...这样的话,每次调用 foo() 函数的时候,都会栈上分配8 MB 的内存,因为函数之间传递变量,是...
  • 如果没有显式提供元素初值,则数组元素会像普通变量一样初始化: ...在函数体外定义的内置数组,其元素均初始化为0;...不管数组在哪里定义,如果其元素为类类型,则自动为该数组的元素提供显式初始化。
  • 大数组要定义在main函数外部

    千次阅读 2019-03-09 19:38:35
    大数组要定义主函数外部的原因 全局变量静态存储区内分配内存,而局部变量是栈内分配内存空间的。C语言编写的程序会运行...因此,当我们需要定义一个极大的数组时,最好mian 函数外部定义这个大数组。 ...
  • void Send_Data( uint8 * data_buf ,uint32 length) {  CLE=0;  CE=0;delay 15ns;  ALE=0;delay 15ns;...使用 uint8 ...这里Send_Date函数中是以个纸箱数组的首地址的指针为变量。
  • 栈上申请临时内存,并将数组地址插入函数 RetArr ,因为数组名就是指向数组的指针。而函数 RetArr 内用 a[i] 对数组进行修改,最终该修改可以影响函数外的数组值。因为 a[i] 和 *a(i) 是一样的。
  • 大数组要定义主函数外部的原因 全局变量静态存储区内分配内存,而局部变量是栈...因此,当我们需要定义一个极大的数组时,最好mian 函数外部定义这个大数组。 作者: 妖刀 来源:CSDN 原文:https://blog.c...
  • 函数概述 函数的分类 函数是C语言程序基本的组成单位,每个程序有且只能有一个主函数(main()),...在函数定义函数声明的参数,称为形参;在函数调用的参数,称为实参。 C语言中,一个函数函数体中(包...
  • [C]C语言声明/函数声明/数组声明

    千次阅读 2019-10-05 00:32:16
    括号()表示这是一个函数,而方括号[]表示这是一个数组。 3.前缀操作符: *表示“指向...的指针” 另外,对于有const或volatile关键字的声明,当const或volatile后面紧跟类型说明符(int, long等...
  • 第一:本题是 使用函数 针对数组 进行操作,所以传参的时候切记: 数组传参传的是数组首元素的地址,而不是数组内容/大小,如果函数内部需要用到数组大小,那么必须在函数外部计算出数组大小然后再进行传参。...
  • Shell 函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用直接调取即可。 Shell 中的函数和C++、Java、Python、C# 等其它编程语言中的函数类似,只是语法细节有所差别。
  • 如果数组较大,大约10^6级别,则需要定定义在主函数的外边(其他函数也一样)。 因为函数内部的局部变量来自系统栈,允许申请的空间比较小。 函数外部的全局变量来自静态存储区,允许申请的空间比较大。 ...
  • 用ajax访问数据库的时候,想$.ajax({内部获取留在外部函数使用。 但是一直是有数组显示但是为空,例如这样: 取值也是显示undefined,length也是0。 原因是ajax默认异步方式,先访问后面内容再向数据库请求...
  • 实验3 函数数组

    2018-08-29 20:14:11
    实验3 函数和数组 ... 掌握数组在函数参数中的传递方式。 掌握一维数组的排序,并用二维数组处理矩阵。 二、知识要点 (一)函数 1. 函数定义格式 &lt;类型名&gt;&lt;函数名&g...
  • 文章目录一:shell函数1.1:函数定义的简化写法1.2:函数的作用范围1.3:递归函数二:shell数组2.1:应用场景包括2.2:数组的描述2.3:数组定义方法2.3.1:到100数组2.3.2:创建1到100奇数组2.3.3:创建任意数字及...
  • 函数的外部定义了一个BlockSize,然后又定义了一个结构(两者都是在函数外部)。编译的时候,出现一个error。提示说:variably modified 'array' at file scope const int BlockSize = 20;//define BlockSize ...
  • 函数传递数组 例子

    千次阅读 2012-07-09 23:02:57
    函数传递数组的问题 void fun(char b[10]) { int i = sizeof(b); char c = b[3];...如果数组b 真正传递到函数内部,那i 的值应该为10。...难道数组b 真的没有传递到函数...C 语言中,当一维数组作为函数参数的
  • 最近做清华的一道范围查询的题目,由于要求是到500000,所以我就把部分数组定义在了main函数外面。// #include&lt;iostream&gt; #include &lt;stdio.h&gt; #include&lt;string.h&gt; //...
  • 数组定义main函数外面

    千次阅读 2018-08-04 16:34:12
    //输出一个整数序列中与指定数字相同的数的个数。 // //输入 //输入包含三行: //第一行为N,表示整数序列的长度(N &lt;= 100); //第二行为N个整数,整数之间以一个空格分开;...//第三行包含一个整数,为指定的...
  • 推荐:《精通Node.js开发》 《Angular.js视频详解》 腾讯QQ 1405491181 微信号 forjs_orgbook thisJavaScript函数look ...定义时可用函数定义表达式或者函数声明语句。fuck bookvar f = function fact(x){}good
  • 本文从初学者的角度,深入浅出地详解什么是指针、如何使用指针、如何定义指针、如何定义数组指针和函数指针,并给出对应的实例演示;接着,区别了数组指针与指针数组、函数指针与指针函数;最后,对最常混淆的引用...
  • 文章目录一:shell函数1.1:函数定义的简化写法1.2:函数的作用范围1.3:递归函数二:shell数组2.1:应用场景包括2.2:数组的描述2.3:数组定义方法2.31:创建1到100数组2.32:创建1到100奇数组2.33:创建任意数字及...
  • 为了防止栈溢出,俗称爆栈
  • 在定义函数时,会声明形参数组大小,也可不声明大小(float aray[ ]),但实际上,指定其大小是不起任何作用的,因为编译系统只是将实参数组首元素的地址传递给形参数组名。因此,形参数组首元素和实参数组首元素...
  • C++中如何使函数返回多个数组

    千次阅读 2019-07-11 18:47:46
    1. 将待返回的数组在外部进行创建,之后作为函数的输入参数被修改,由于函数不需要返回值,不会产生内存泄露之类的问题。举例如下: #include <iostream> const int ArSize = 12; void sum_and_sub(int arr1...
  • 今天,写条件编译的时候,出现了在函数外部给全局变量赋值的情况,gcc报错,那么c语言为什么不允许在函数外部给变量赋值呢?为什么声明变 量的时候可以对变量进行赋值? 出错代码: 1 /* 2 * ======...
  • 通过一道题来解析宏定义数组、字符串和函数

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 210,006
精华内容 84,002
关键字:

在函数外部定义数组时