数组和指针参数是如何被编译器修改的

转自  http://blog.csdn.net/todd911/article/details/8831963

实参                                         所匹配的形式参数

数组的数组     char c[8][10]; (有步长,10char)     char(*)[10];     数组指针

指针数组       char *c[15];(无步长)                char **c;        指针的指针

数组指针(行) char (*c)[64];(有步长,64char)    char (*c)[64]; 不改变

指针的指针     char **c; (无步长)                  char **c;        不改变

你之所以能在main()函数中看到char **argv这样的参数,是因为argv是个指针数组(即char *argv[]),这个表达式被编译器改写为指向数组第一元素的指针,那就是一个指向指针的指针,如果argv参数事实上被声明一个数组的数组(也就是char argv[10][15]),它被编译器改写为char(*argv)[15],而不是char **argv.

总结如下:如果指针指向的数组有步长,则不能转换成指向指针的指针。

时间: 2024-10-12 16:58:38

数组和指针参数是如何被编译器修改的的相关文章

数组与指针——参数

引入: #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

C/C++数组和指针详解

/****************************************************************/ /*            学习是合作和分享式的! /* Author:Atlas                    Email:[email protected] /*  转载请注明本文出处: *  http://blog.csdn.net/wdzxl198/article/details/9087497 /*************************

转:数组与指针的区别

转自:二维数组和指向指针的指针 一道面试题引发的问题,首先要知道[]的优先级高于*,题目: char **p,a[6][8]; 问p=a是否会导致程序在以后出现问题?为什么? 直接用程序说明: #include<stdio.h> void main(){ char **p,a[6][8]; p = a; printf("\n");} 编译,然后就会发现通不过,报错:错误 1 error C2440: “=”: 无法从“char [6][8]”转换为“char **” 于是乎

二维数组做函数参数、指向指针的指针做函数参数

这里有一篇文章  写的很好http://blog.csdn.net/f81892461/article/details/8974087 该文章中有一句话  总之就是:数组无法作为参数,总会被编译器将地址赋值给形参指针的,即使指针定义成数组形式,也还是指针.然后各种差别都是由数组和指针不同的定位元素的方式导致的. 这句话说的很对啊,数组做形参的是时候都是被当成指针来处理的.不明白这句话的可以看一下,参考文章链接里的那幅图,注意比较一下下图中的两个:data+1,第一个data+1指向的是元素dat

《C专家编程》数组和指针并不同--多维数组

<C专家编程>数组和指针并不同 标签(空格分隔): 程序设计论著笔记 1. 背景理解 1.1 区分定义与声明 p83 声明相当于普通声明:它所说明的并非自身,而是描述其他地方创建的对象,声明可以多次出现: 定义相当于特殊声明:它可以为对象分配内存,只能出现在一个地方. 1.2 数组和指针的访问方式 左值和右值 ???????? X = Y ; 符号X的含义是X所代表的地址,这被称为左值,左值在编译时可知,左值表示存储结果的地方. 符号Y的含义是Y所代表的地址的内容,这被称为右值,右值直到运行时

数组和指针作为函数参数——高质量C、C++编程指南

本文内容出自<高质量C.C++编程指南>.阅读之后理解,然后通过自己的话和例子讲清楚,这样才是学习之道.以下内容都是自己所认为的东西,如果哪里错了,希望各位大神指出. 1.数组作为函数的参数进行传递时,该数组自动退化为同类型的指针 结果: 第一张图中,str为数组,此时的长度为6,而作为函数参数时退化为指针了,指针的长度固定为4. 第一张图中,str为数组,所以不能对str进行自增或自减,而在函数中是可以的,因为退化为指针了,而指针时可以进行自增自减的. 2.指针参数是如何传递内存的 传递方式

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'; //*(地址) 就能访问和修改这个地址上的值了,也就是访问和修改数组的某个元素了:

C语言--- 高级指针2(结构体指针,数组作为函数参数)

一.结构体指针 1. 什么是结构体指针?指向结构体变量的指针     结构体:     typedef  struct stu{                          char name[20];                          char sex;                          int age;                    }Student;     Student stu1 = {"zhangsan",'m',23};  

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

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