数组参数和指针参数

1.C语言中只会以值拷贝的方式传递参数

2.当向函数传递数组时,将数组名看做常量指针传数组首元素地址

3.二维数组参数同样存在退化的问题,二维数组可以看做是一维数组,二维数组中的每个元素是一维数组

4.二维数组参数中第一维的参数可以省略

5.C语言中无法向一个函数传递任意的多维数组

6.为了提供正确的指针运算,必须提供除第一维之外的所有维长度

7.限制:一维数组参数-必须提供一个标志数组结束位置的长度信息

二维数组参数-不能直接传递给函数

三维或更多维数组参数-无法使用

#include <stdio.h>

void access(int a[][3], int row)
{
    int col = sizeof(*a) / sizeof(int);
    int i = 0;
    int j = 0;
    
    printf("sizeof(a) = %d\n", sizeof(a));
    
    for(i=0; i<row; i++)
    {
        for(j=0; j<col; j++)
        {
            printf("%d\n", a[i][j]);
        }
    }
}

int main()
{
    int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
    
    access(a, 3);
}
时间: 2024-10-13 22:22:47

数组参数和指针参数的相关文章

C之数组参数和指针参数(三十一)

我们在前面讲了在 C 语言中,数组参数会退化为指针.那么这是为什么呢?在 C 语言中只会以值拷贝的方式传递参数,当向函数传递数组时,不是将整个数组拷贝一份传入函数而是将数组名看做常量指针传数组首元素地址. 那么当初在设立 C 语言时,主要是用于 Unix 操作系统,而 Unix 效率要求很高.所以 C 语言以高效作为最初设计目标:a> 参数传递的时候如果拷贝整个数组执行效率将会大大下降:b> 参数位于栈上,太大的数组拷贝将导致栈溢出.函数调用栈是用一片内存来存放的,如果栈溢出,那么函数调用将无

C语言学习笔记--数组参数和指针参数

1. 数组参数退化为指针的意义 (1)C 语言中只会以值拷贝的方式传递参数,当向函数传递数组时,将整个数组拷贝一份传入函数导致执行效率低下,C 语言以高效作是最初的设计目标,所以这种方法是不可取的. (2)参数位于栈上,太大的数组拷贝将导致栈溢出. (3)将数组名看做常量指针,传递的是数组的首元素地址,而不是整个数组. 2. 二维数组参数 (1)二维数组参数同样存在退化的问题: 二维数组可以看做是一维数组,其中的每个元素又是一个一维数组 (2)二维数维参数中第一维的参数可以省略 ①void f(

第35课 数组参数和指针参数分析

1. 数组参数退化为指针的意义 (1)C语言中只会以值拷贝的方式传递参数,当向函数传递数组时,将整个数组拷贝一份传入函数导致执行效率低下,C语言以高效作是最初的设计目标,所以这种方法是不可取的. (2)参数位于栈上,太大的数组拷贝将导致栈溢出. (3)将数组名看做常量指针,传递的是数组的首元素地址,而不是整个数组. 2. 二维数组参数 (1)二维数组参数同样存在退化的问题: 二维数组可以看做是一维数组,其中的每个元素又是一个一维数组 (2)二维数维参数中第一维的参数可以省略 ①void f(in

C++Review14_数组参数和指针参数

一.数组参数: 1 //数组作为参数,编译器会把它解释为一个指向其首元素首地址的指针: 2 void func(char a[],int length){ 3 //a表示的是首元素的首地址,a+3表示的是数组第三个元素的首地址 4 //数组下标和指针形式访问都行: 5 cout<<a[3]<<endl; 6 cout<<*(a+3)<<endl; 7 *(a+3) ='o'; //*(地址) 就能访问和修改这个地址上的值了,也就是访问和修改数组的某个元素了:

数组参数和指针参数实例

1.#include <stdio.h> void access(int a[][3], int row){    int col = sizeof(*a) / sizeof(int);    int i = 0;    int j = 0;        printf("sizeof(a) = %d\n", sizeof(a));        for(i=0; i<row; i++)    {        for(j=0; j<col; j++)     

数组与指针——参数

引入: #include <stdio.h> #include <stdlib.h> void fun(char **q) { exit; } void main() { char **p,a[6][8]; p = a; fun(a); } 编译不能通过! ERROR:不能将"char (*)[8]"类型的值分配到"char **"类型的实体. ERROR:"char (*)[8]"类型和"char **&quo

指针参数是如何传递内存的(转载)

参数策略 如果函数的参数是一个指针,不要指望用该指针去动态申请内存.如下:   void GetMemory(char *p, int num) { p = (char *)malloc(sizeof(char) * num); } void Test(void) { char *str = NULL; GetMemory(str, 100); //str仍未NULL strcpy(str, "hello"); //运行错误 }   原因是编译器总是为每个参数制作临时副本.指针参数p,

【转】【c++】指针参数是如何传递内存的

参数策略 如果函数的参数是一个指针,不要指望用该指针去动态申请内存.如下: void GetMemory(char *p, int num) { p = (char *)malloc(sizeof(char) * num); } void Test(void) { char *str = NULL; GetMemory(str, 100); //str仍未NULL strcpy(str, "hello"); //运行错误 } 原因是编译器总是为每个参数制作临时副本.指针参数p, 其副本

C语言二维数组作为函数的参数

前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: #include <cstdio> void print(int *a[3]) { printf("%d\n",a[0][0]); } int main() { int a[2][3] = {1,2,3,4,5,6}; print(a); return 0; } 编译程序时候,在第10行提示错误信息:|