概览
- sizeof 计算数组元素个数,指定初始化器
- 函数中传递数组的通用方法与两个指针方法、越界指针有效、只读形参
- 双重间接
- 数组指针与指针数组
- 函数与多维数组
- 变长数组
示例
- sizeof 计算数组元素个数,指定初始化器
#include <stdio.h>
int main(void){
int a[] = {1,2,3,4,5,6,7};
printf("%zd",sizeof a / sizeof(int));
}
- 函数中传递数组的通用方法与两个指针方法、越界指针有效、只读形参
#include <stdio.h>
void myPrint(int *, int);
int main(void){
int a[] = {1,2,3,4,5,6,7};
myPrint(a,7);
}
void myPrint(int * a, int n){
for(int i=0; i<n; i++){
printf("%d ",*(a+i));
}
}
#include <stdio.h>
void myPrint(int *, int *);
int main(void){
int a[] = {1,2,3,4,5,6,7};
myPrint(a,a+7);
}
void myPrint(int * start, int * end){
for(; start < end; start++){
printf("%d ",*start);
}
}
#include <stdio.h>
void myPrint(const int *, int);
int main(void){
int a[] = {1,2,3,4,5,6,7};
myPrint(a,7);
}
void myPrint(const int * a, int n){
a[0] = 2;
}
- 双重间接
#include <stdio.h>
int main(void){
int a[][3] = {{1,2,3},{4,5,6},{7},[4]={3,2,9}};
printf("%d\n", **a);
printf("%d\n", *a[0]);
printf("%d\n", a[0][0]);
printf("%d\n", *(*(a+4)+2));
}
- 数组指针与指针数组、复合字面量
#include <stdio.h>
int main(void){
int (*a)[3] = (int [][3]){{1,2,3},{4,5,6},{7},[4]={3,2,9}};
int b[][3] = {{1,2,3},{4,5,6},{7},[4]={3,2,9}};
printf("%d\n",a[4][2]);
printf("%d\n",b[4][2]);
printf("%zd\n", sizeof b/sizeof(int));
printf("%zd\n", sizeof *a/sizeof(int));
int *c[3];
printf("%p\n",c[1]);
printf("%d\n",*c[1]);
}
- 函数与多维数组
void myPrint(int (*)[3],int);
//void myPrint(int [][3],int);
int main(void){
int a[][3] = {{1,2,3},[2]={4,5,6}};
myPrint(a,3);
}
void myPrint(int (*a)[3], int n){
for(int i = 0; i<n; i++){
for(int j = 0; j<3; j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
}
// 结果
// 1 2 3
// 0 0 0
// 4 5 6
- 变长数组
#include <stdio.h>
void myPrint(int, int, int [*][*]);
int main(void){
int row = 3;
int col = 3;
int a[row][col];
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
a[i][j] = i+j;
}
}
myPrint(row,col,a);
}
void myPrint(int row, int col, int a[row][col]){
for(int i = 0; i<row; i++){
for(int j = 0; j<col; j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
}