一、传递数组:将数组作为参数传入函数,或将数组作为数据当成是函数的返回值

    1、定义:可以传入和传出数组

    2、特征:

      1)、将数组作为参数传递给函数的本质是传递数组的地址,这种传递无需复制数组元素,所以更加高效;

      2)、数组名自身暗中包含了数组的大小,传递过程中只包含地址,因而丢失了数组大小信息;

  #include <stdio.h>

  void displayArr(int arr[]){
for(int i = ; i < ; i++){
printf("%d\t", arr[i]);
}
printf("\n"); return;
} int main(int argc, char **argv)
{
int arrInt[] = {, , , , , , , ,};
displayArr(arrInt); return ;
}

    说明:由于在displayArr()函数中缺少了数组长度,由于盲目指定了数组长度,因此会输出多余的垃圾值。

      3)、将数组作为参数时,可以使用数组表示法,arrName[]表示法;

  #include <stdio.h>

  void displayArr(int arr[], int size){
for(int i = ; i < size; i++){
printf("%d\t", arr[i]);
}
printf("\n"); return;
} int main(int argc, char **argv)
{
int arrInt[] = {, , , , , , , ,};
int size = sizeof(arrInt) / sizeof(int);
displayArr(arrInt, size); return ;
}

    说明:由于在displayArr()函数声明中使用数组表示法,传入了数组长度,在函数内部使用数组法(也可以使用指针法),保证了程序的健壮行。

      4)、将数组作为参数时,可以使用指针表示法,*arrName表示法;

  #include <stdio.h>

  void displayArr(int *arr, int size){
for(int i = ; i < size; i++){
printf("%d\t", *(arr + i));
}
printf("\n"); return;
} int main(int argc, char **argv)
{
int arrInt[] = {, , , , , , , ,};
int size = sizeof(arrInt) / sizeof(int);
displayArr(arrInt, size); return ;
}

    说明:由于在displayArr()函数声明中使用指针表示法,传入了数组长度,在函数内部使用指针法(也可以使用数组法),保证了程序的健壮行。

      5)、采用指针表示法和采用数组表示法必须传入数组的长度;

    3、指针数组的应用:

      1)、声明方式:int*  arrName[size],此时数组中的元素是指针,若需要获取指针的内容,需要使用解析操作符;

      2)、数组元素需要手动分配内存空间;

      3)、使用数组表示法获取数组元素的内容:*arrName[index]获取指针内容;

      4)、arrName[index] 等价于(*arrName + index),切记其中存储的是整型指针

      5)、使用*arrName[index]获取数组下标对应的地址处的内容

      6)、使用指针表示法获取数组元素的内容:*(*arrName + index)获取指针内容;

      7)、(*arrName + index)等价于arrName[index],切记其中存储的是整型指针

      8)、使用*(*arrName + index)获取指针运算后对应的地址处的内容

      9)、如果不能确定具体的方式,就在初始化和输出使用同一种方式

      10)、在代码2中如果在初始化时,使用第10行代码的形式,可以使用第15行代码输出数据

      11)、在代码2中如果在初始化时,使用第10行代码的形式,可以使用第16行代码输出数据

      12)、在代码2中如果在初始化时,使用第10行代码的形式,可以使用第18行代码输出数据

      13)、在代码2中如果在初始化时,使用第11行代码的形式,可以使用第17行代码输出数据

      14)、在代码2中如果在初始化时,使用第11行代码的形式,可以使用第18行代码输出数据
  代码如下代码1:

  #include <stdio.h>
#include <stdlib.h> void displayArr(int **arr, int size){
for(int i = ; i < size; i++){
printf("%d\t", *(*arr + i));
}
printf("\n"); return;
} int main(int argc, char **argv)
{
int size = ;
int* arrInt[size];
for(int i = ; i < size; i++){
*(arrInt + i) = (int *)malloc(sizeof(int));
*(*arrInt + i) = i + ;
}
displayArr(arrInt, size); return ;
}

    再看下面的代码代码2:

  #include <stdio.h>
#include <stdlib.h> int main(int argc, char **argv)
{
int size = ;
int* arrInt[size];
for(int i = ; i < size; i++){
arrInt[i] = (int *)malloc(sizeof(int));
//*arrInt[i] = 101 + i;
*(*arrInt + i) = + i;
} for(int i = ; i < size; i++){
//printf("%d\t", arrInt[i][0]);
//printf("%d\t", *arrInt[i]);
//printf("%d\t", *(*arrInt + i));
printf("%d\t", **arrInt + i);
} return ;
}

  3、传出,将数组返回

25深入理解C指针之---传递数组的更多相关文章

  1. 26深入理解C指针之---不规则数组与指针

    一.不规则数组:每一行的列数不相等 1.复合字面量: 1).复合字面量是一种C构造 2).外形和数组声明差不多,写法与类型转换一样,(int[3]){10, 20, 30,} 3).将多个复合字面量可 ...

  2. &lt;深入理解C指针&gt;学习笔记和总结 第四章 指针和数组

    数组是一个什么玩意: 数组和指针我的理解,有同样之处也有不同之处.因有同样之处,因此一些资料上说,数组和指针本质是同样的.因有不同之处,因此也有一些资料上说,数组和指针是不一样的. 同样之处: 数组名 ...

  3. 深入理解C指针之四:指针和数组

    原文:深入理解C指针之四:指针和数组 数组是C内建的基本数据结构,数组表示法和指针表示法紧密关联.一种常见的错误认识是数组和指针完全可以互换,尽管数组名字有时可以当做指针来用,但数组的名字不是指针.数 ...

  4. 33深入理解C指针之---通过字符串传递数据

    一.传递字符串:在函数的参数列表中,将参数声明为char指针即可实现通过字符串传递参数 1.特征: 1).字符串以char指针的形式传递,一般是const指针传递: 2).使用字符数组声明字符串,调用 ...

  5. 数组与指针的区别,以及在STL中传递数组/指针

    数组和指针在作为实参传入T[] 或T*的形参时没有区别 void f(int pi[]) { cout << sizeof(pi) << endl; } int a[5] = ...

  6. 23深入理解C指针之---数组的基础

    数组是c语言内置的数据结构,数组有一维数组.二维数组和多维数组.使用数组传递数组时,必须传入数组的大小. 一.数组的特征:阐明数组的特点 1.数组要素: 1).数组类型:数组中存储的数据的类型: 2) ...

  7. 深入理解C指针之五:指针和字符串

    原文:深入理解C指针之五:指针和字符串 基础概念 字符串可以分配到内存的不同区域,通常使用指针来支持字符串操作.字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常 ...

  8. 深入理解C指针之三:指针和函数

    原文:深入理解C指针之三:指针和函数 理解函数和指针的结合使用,需要理解程序栈.大部分现代的块结构语言,比如C,都用到了程序栈来支持函数的运行.调用函数时,会创建函数的栈帧并将其推到程序栈上.函数返回 ...

  9. C 真正理解二级指针

    本文转载自CSDN博主liaoxinmeng,做数据结构时遇到指针方面的问题,想了许久,因此我觉得很有必要复习一下二级指针及其使用 正文如下: 指针是C语言的灵魂,我想对于一级指针大家应该都很熟悉,也 ...

随机推荐

  1. 【Kafka】搭建和测试等问题

    1.安装启动kafka #跳转到下载目录cd /opt/setup # 下载安装包 wget http://mirror.bit.edu.cn/apache/kafka/0.10.2.0/kafka_ ...

  2. python 类的使用

    目录 类的继承 类的派生 类的组合 菱形继承问题 多态与多态性 dataclass的使用 类的继承 什么是继承,在生活中,子承父业,父亲和儿子就是继承的关系 在python中,父类和子类(派生类),父 ...

  3. CUB reduce errorinvalid configuration argument

    解决CUB reduce errorinvalid configuration argument问题 在写TensorFlow代码时遇到报错 CUB reduce errorinvalid confi ...

  4. Java底层基础题

    一.Java底层基础题 1.SpringMVC的原理以及返回数据如何渲染到jsp/html上? 答:Spring MVC的核心就是DispatcherServlet , 一个请求经过Dispatche ...

  5. 水题:CF16C-Monitor

    Monitor 题目描述 Reca company makes monitors, the most popular of their models is AB999 with the screen ...

  6. MVC&JQuery如何根据List动态生成表格

    背景:在编码中,常会遇到根据Ajax的结果动态生成Table的情况,本篇进行简要的说明.这已经是我第4.5篇和Ajax有关的随笔了,互相之间有很多交叠的地方,可自行参考. 后台代码如下: public ...

  7. TSS (任务状态段)的作用及结构

    1.什么是TSS TSS全称Task State Segment ,是操作系统在进行进程切换时保存进程现场信息的段 2.TSS什么时候用,有什么用 TSS在任务(进程)切换时起着重要的作用,通过它保存 ...

  8. mac配置启动mongodb

    1.新建文件夹,用于存放数据库文件.建议放在自己用户名的文件夹下,不需要sudo会方便很多. 在Users的自己用户名环境下: mkdir [文件夹名] 2.转到mongodb的Bin目录,执行mon ...

  9. HDU4010 Query on The Trees (LCT动态树)

    Query on The Trees Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Othe ...

  10. HDU 4605 Magic Ball Game 主席树

    题意: 给一棵\(n(1 \leq n \leq 10^5)\)个节点的二叉树,除叶子节点外,每个点都有左儿子和右儿子. 每个点上都有一个权值. 游戏规则是这样的:在根节点放一个权值为\(X\)的小球 ...