c语言数组名和指针的关系

2021-07-21  本文已影响0人  李永开

一.数组名和指针

//
//  main.c
//  cdemo
//
//  Created by liyongkai on 2021/6/6.
//

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>



int main(int argc, const char * argv[]) {
   
    int arr[] = {1, 2, 3, 4};
    printf("%lu\n", sizeof(arr));   //16
    printf("%lu_%lu\n",&arr,&arr+1);//140732920755344_140732920755360 相差16
    //1. sizeof   2.&arr取地址符
    //以上两种情况下,arr指针代表的是数组本身,而不是指向数组的首元素地址的指针
    //除了以上两种情况下,数组名都是指向首元素的指针

    
    
    //2.arr是个指向常量的指针,如果赋值NUll会报一下的错误
    //arr = NULL;//Array type 'int [4]' is not assignable
    
    
    //下面的都可以正确打印
    for (int i = 0; i < sizeof(arr)/sizeof(int); i ++) {
        printf("%d",arr[i]);
        printf("%d", *(arr + i));
    }
 
}

二.数组下标是否能为负数

可以的,编译器对这块没有做要求,所以是可以的。

三. 定义数组指针

//
//  main.c
//  cdemo
//
//  Created by liyongkai on 2021/6/6.
//

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>



int main(int argc, const char * argv[]) {
   
    int arr[5] = {1, 2, 3, 4, 5};
    
    //1. 先定义数组类型,然后定义数组指针类型
    //typedef 定义数组类型
    typedef int (ARRAY_TYPE)[5];
    ARRAY_TYPE array;//  = int arr[5];
    
    for (int i = 0; i < 5; i ++) {
        array[i] = i;
    }
    
    for (int i = 0; i < 5; i ++) {
        printf("%d\n", i);
    }
    
    //定义 数组指针 类型, 指针指向数组
    ARRAY_TYPE *p = &array;
    printf("%d", *(*p + 1)); // 1   *p拿到了数组的首地址.
    
    
    
    //2.直接定义数组指针类型
    typedef int (*ARRAY_POINTER) [5];
    ARRAY_POINTER pa = &arr;
    
    
    //3. 直接定义数组指针变量
    int (*ARRAY_PARAM)[5] = &arr;
}

四.二维数组

//
//  main.c
//  cdemo
//
//  Created by liyongkai on 2021/6/6.
//

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>
#include <typeinfo>



void printArr(int (*parr)[3]) {
    
}

int main(int argc, const char * argv[]) {
    int arr1[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    
    int arr[][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    printf("%d\n",arr[2][2]);// 9
    printf("%d\n", *(*(arr+2) + 1));// 8
    
    printArr(arr);
}






上一篇 下一篇

猜你喜欢

热点阅读