一.数组名和指针
//
// 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);
}
网友评论