菜鸟之路-04

1)数组的定义:

/*

 数组的定义: 1. 类型  数组名[]{常量或者常量表达式}

            2.数组的命名规则要遵守标示符的命名规则

            3.不能定义同名的数组名

            4.数组可以宏定义

            5.

 

 */

#include


int main(int argc, const char * argv[]) {

    int len=4;

    int arr[len];  这样程序是不会报错的,因为系统给我们优化了,但在C++系统中是会报错的。

    

    

    

//    #define M 5

//    int arr[M]={};//这就是宏定义

//    int x,y,arr2[5];//定义数组时可以定义其它变量。

    int arr1[];

    arr1={1,2};

    

//    1.数组和数组变量之间,不能赋值

//    例:int nums[5] = {1,2,3,4,5};

//    int nums2[5] = nums; //报错的

//    

//    2.数组名声明后也不能赋值

//    int nums[5];

//    nums = {1,2,3,4,5};

//    

//    为什么会这样?

//    因为数组名是一个地址常量

//    

//    不能通过数组名直接赋值

//    

//    


    

    

    return 0;

}



2)数组的初始化:

#include


int main(int argc, const char * argv[]) {

    int a[3]={1,2,4};//完全初始化

    int a1 [3]={1};//部分初始化

    //    int len=4;

    //    int [len]={1,2,3,4};   这样初始化数组是会报错滴

    

    

    //    int a2[10]={};

    //    for (int i=0; i<=9; i++) {

    //        printf("%d\n",a[i]);

    //    }  这样初始化数组,没有赋值,系统会自动的赋予垃圾值。

    //    int a3[10]={1,2};

    //        for (int i=0; i<=9; i++) {

    //            printf("%d\n",a3[i]);

    //        }这样初始化数组,部分初始化,剩下的数组的值,系统会默认为零

    //    int a4[10]={'a','b',};

    //    for (int i=0; i<=9; i++) {

    //        printf("%d\n",a4[i]);

    //    }字符型用%d打印输出是ASCII表的值。

        int a4[10]={'a','b',};

            for (int i=0; i<=9; i++) {

                printf("%d\t",a4[i]);//%d打印的话\0  就是0

            } // 看结果是a,b,其实后面有许多的\0(不可见字符),0在系统中义字符串打印就是NULL(空自元)

    return 0;

}



3)数组的越界及计算数组的长度:


#include


int main(int argc, const char * argv[]) {

    int nums[2]={1,2};

    nums[2]=9;//这是不安全的,因为这个空间不属于你的

              //即使没有报错,但是这个数有可能会丢失

    printf("%d %d %d\n",nums[0],nums[1],nums[2]);//没有写nums[2]=9,那么数组的越界是个垃圾值

//    int arr1[9]={1,2,34,5,6,7,8,9,0};

//    

//    int len=sizeof(arr1)/sizeof(int);

//    printf("%d",len);

    //f=公式  sizeof(数组名)/sizeof(类型)

    return 0;

    

}



4)数组作为函数的参数:

/*

 数组的函数的参数

    void  test(int arr){

 

 arr[0]=90;

 }

 数组是目前我们唯一学的类型里面,只有数组是共享空间的,也就是所谓的引用传递

 

 

 */



/*


//#include

//void  test(int arr[]){

//    

//    arr[0]=90;

//}

//

//int main(int argc, const char * argv[]) {

//    int a[5]={1,2,3,4,5};

//    test(a);

//    printf("%d\n",a[0]);// 90  数组名作为函数的参数,传递的是地址

//    return 0;      实参是数组名a,形参是arr

//}                       此时,a arr在内存中代表的是同一块内存空间


*/


/*


//#include

//int sum(int x,int y){

//    return x+y;

//

// }

//int main(){

//    int a[5]={1,2,3,4,5};

//    int s= sum(a[0], a[4]);//值传递  a[0]=1,a[4]=5传给sum中得x y

//    printf("s=%d",s);

//    return 0;

*/



/*

#include

void test(int num){

    if (num>0) {

        printf("你好\n");

    }else


        printf("你好吗\n");

}


int main(){

    int a[5]={2,0,-1,-3,1};

    for (int i=0; i<5; i++) {

        test(a[i]);//数组元素实现值传递。

    }


    return 0;


}*/

#include

void test(int arr[]){//这里的形参是可以不写的,没有关系

    for (int i=0; i<5; i++) {

        printf("%d",arr[i]);

    }

}

void test1(int arr[]){

    int len=sizeof(arr);

    printf("\nlen=%d\n",len);

    }


int  main(){

    int a[5]={1,2,3,4,5};

    float f1[5]={2.1f,3.2f,4.3f,5.3f,6.1f};

    test(a); //正常写法

    test(f1);//错误写法,因为实参的类型和形参的类型不一致,虽然不会报错,但运行的值是垃圾值。

    int a1[10]={1,2,3,45,6,8,9,42,34,1};

    test(a1);//可以的,长度虽然不一样,但是不会报错,但是运行结果和实际是不相符的

//关于数组名作为函数的参数后,数组的长度信息丢失的问题


    int len=sizeof(a1);

    printf("\nlen=%d\n",len);//40

    

    //调用test1之后,再来看看len打印的值

    test1(a1);//结果为8    注意:C语言规定,不管你什么类型数据,数据的内存地址在内存中占用8个字节

    

    

    

    

    

    

    

    

}


你可能感兴趣的:(菜鸟之路-04)