C++的基础知识(十一)--数组做函数参数、数组名a与&a区别、数组名a的"数据类型"

1、数组作为函数参数
C语言中,数组做为函数的参数,退化为指针。数组作为参数传给函数时,传的是指针而不是数组,传递的是数组的首元素的地址。
一般来说函数参数如果为数组,可以有两个参数,一个是数组名,一个是数组长度,对于排序而言,一般是要知道给定数组的首元素的地址,即需要排序的数组在内存中的起始地址,同时还需给定待排序的数据个数。void sortArray ( int a[ ] , int num ) 以及void sortArray (int a[100] ,int num ) 都可以用void sortArray (int *a ,int num ) 表示。

//冒泡排序
void sortArray(int *a ,int num )  
{  
    int i ,j ,temp;  
    for(i =0 ;i <num;i++)//外层每次选定出需要排序的一个元素,依次向后  
    {  
        for( j=i+1; j<num; j++ )//内层:外层选定的一个元素与其后所有元素依次比较,找出最小的元素  
        {  
            if(a[i]>a[j])     //交换类代码  
            {  
                temp = a[i];  
                a[i]=a[j];  
                a[j]=temp;                
            }  
        }  
    }  

}   

2、参数传递
如果a是一个数组

    int num =0 ;             //在32机器中告诉C编译器分配4个字节的内存   
    int a [] = {1,3,5,12,6,7,54,32}; //告诉C编译器分配32个字节的内存     
    //    num = sizeof(a)/sizeof(int);    
        num = sizeof(a)/sizeof(a[0]);   
    printf("排序之前:");  
    printArray(a,num);  
    sortArray(a,num);   
    printf("排序之后:");  
    printArray(a,num);  

如果a是一个单一整形变量的地址

int test =5;  
int *p = &test;  
int num1 = 0;  

num1 = sizeof(p)/sizeof(p[0]);  
sortArray(p,num1);   
printf("排序之后:");  
printArray(p,num1); 

对同一个对象有两种不同的符号表示,如定义:a[n]时等价于(a+n),即寻址到内存的a,然后移动n个单元,再取出数组。故p[0]等价于(p+0),该值的类型为int型。

num1=sizeof(p)/sizeof(p[0]) 等价于 num1=sizeof(p)/sizeof(int );

3、声明数组参量

/**   函数原型声明4中等价形式  
int sum (int *a , int n) 
int sum (int * , int ) 
int sum (int a[] , int n) 
int sum (int [] , int )   //可能略微不熟悉的一种  
*/

定义函数

/**   等价形式  
int sum (int *a , int n) 
{} 
int sum (int a[] , int n) 
{} 
*/  

4、a与&a的区别

int num =0 ;          //在32机器中告诉C编译器分配4个字节的内存   
int a [] = {1,3,5,12,6,7,54,32};   //告诉C编译器分配32个字节的内存   

printf("a:%d ,a+1:%d,&a:%d,&a+1:%d\n",a,a+1,&a,&a+1) ;  

//a+1 和 &a+1 结果不一样    
//虽然输出结果上面,a和&a一样 。 但是a 和 &a所代表的数据类型不一样  

/*重要*/   
//a 代表的数据首元素的地址 (首元素),同时与整个数组地址重合,但其不能代表整个数组,只能代表起始个体的地址   
//&a代表的是整个数组的地址   (特别特别的注意) 它的加1是以整块数组所占字节数总数为单位1 

输出结果:a:1638176 ,a+1:1638180,&a:1638176,&a+1:1638208

5、指针所占字节数
在64位机器中,int*的指针为8个字节,在32位中int*为 4个字节

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章