龙空技术网

C++|存储类型typedef及数组名的上下文

小智雅汇 524

前言:

现在兄弟们对“c语言数组名”大体比较着重,各位老铁们都想要知道一些“c语言数组名”的相关资讯。那么小编在网上汇集了一些关于“c语言数组名””的相关内容,希望我们能喜欢,姐妹们快快来学习一下吧!

ANSI C把typedef也作为一种存储类型,合理吗?

看下面的实例:

#include<stdio.h>#define SIZE 10typedef int ARRAY [10];         //自定义一个int [10]的整型数组类型void reverseInt(int a[],int n) //整型数组的反转{    int i,t;    for(i=0; i<n/2; i++)    {        t=a[i];        a[i]=a[n-1-i];        a[n-1-i]=t;    }}void reverseInt(ARRAY a)	        // a这里还会退化为一个指针{    int n=sizeof(ARRAY)/sizeof(int); // sizeof a 只是一个指针的长度    for(int i=0; i<n/2; i++)    {        int t=a[i];        a[i]=a[n-1-i];        a[n-1-i]=t;    }}void outputArray(int a[],int n){    for(int i=0; i<SIZE; i++)         printf("%3d",a[i]);    printf("\n");}int main(){    int a[] ={1,2,3,4,5,6,7,8,9,10};            int size = sizeof a / sizeof *a;    outputArray(a,size);    reverseInt(a,size);						    outputArray(a,size);    ARRAY b={11,12,13,14,15,16,17,18,19,20};//用ARRAY类型定义数组a    size = sizeof b / sizeof *b;    outputArray(b,size);    reverseInt(b);						    outputArray(b,size);        while(1);    return 0;}/*  1  2  3  4  5  6  7  8  9 10 10  9  8  7  6  5  4  3  2  1 11 12 13 14 15 16 17 18 19 20 20 19 18 17 16 15 14 13 12 11 */

作为数据类型信息,重要的是能够确定其对应内存块的长度,及其之上能够执行的操作。由上例可见,typedef不同于#define的值替换,是有类型信息的。

理解变量,理解对应的内存块的长度很重要,在C中,有专门的运算符sizeof。

对于内建(built-in)类型,其长度信息由类型关键字来定义。

对于结构体,其长度信息由各成员分量及其对齐来定义。

对于枚举,是一种特殊的int类型。

对于共用体,占用空间最大的类型的长度就是共用体整体的长度。

其实比较复杂的是多维数组。

因为数组名在不同的上下文中有不同的含义。在声明和使用sizeof时可以代表数组整体,其长度是数组全体成员累加的长度。当数组名用做函数参数时,其退化为指针,表示的是数组首元素的地址,其指针指向的长度信息是元素的长度(第一维的长度,如果是一个n维数组,其第一维的长度就是n-1维的整体长度),至于整体的长度信息(每一维的元素个数)则丢失了,所以一般在数组名作参数时,另需一个int类型参数来指定数组第一维的元素个数:

#include <iostream>using namespace std;int arr[3][5] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};void func(int arr[][5],int rows){    cout<<sizeof arr <<endl;    // 4    cout<<sizeof *arr <<endl;   // 20    for(int i=0;i<rows;i++)    {        for(int j=0;j<5;j++)            cout<<*(*(arr+i)+j)<<" ";        cout<<endl;    }}int main(){    cout<< sizeof arr<<endl;                    // 60,                    // 此时的数组名表示整个数组,其长度信息是整个数组的长度    cout<< sizeof *arr<<endl;                   // 20    int rows = sizeof arr / sizeof *arr;    cout<< rows <<endl;     // 3    cout<< sizeof arr / sizeof **arr <<endl;    // 15    func(arr,rows);    int (*p)[5] = arr;   // 此时的数组名是数组首元素,其长度信息是数组元素的长度    cout << sizeof *p <<endl;  // 20    while(1);    return 0;}

对于函数指针,这个指针也是指向一块内存,是函数的存储区域,其类型信息自然是函数,同样也标识出了这一块内存的起始和结束地址。毫无疑问,起始地址是函数名,结束地址由return或符号“}”来标识。

-End-

标签: #c语言数组名