前言:
现在兄弟们对“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语言数组名