C语言学习笔记3

---摘要:C语言学习个人向记录-数组和指针---

数组和指针

数组

初始化

初始化示例,下面这个是写死的

1
const int days[MONTHS]={31,28,31,30,31,30,31,31,30,31,30,31}

指定初始化器

1
int days[MONTHS]={31,23,[4]=31,34,231,[1]=3};

其实不太知道这个为啥要叫“指定初始化器”

可能是个翻译问题

用下标指定某个数

多出来的会顺序指给下几个数

后面的指定覆盖前面的指定

多维数组

指针和数组

指针指的数组头,也就是数组名

1
2
3
4
5
6
double date[];
*(date+2);
*date+2;
&date[3]=date+2;
//一种加和办法
total += *date++;//注意结合律从右往左

指针操作

const 用来保护数组

一般变量,用指针何必呢,直接搞一个副本对吧

然而数组,你每次都去复制肯定不行,缓存遭不住

于是函数调用数组的时候,一般都是调用其指针

出现数组被各种函数加工的情况

我们要保护数组的值,下标也不能超边界,更不能修改未初始化的指针指向的值

1
2
3
4
5
6
7
8
9
10
11
12
13
viod show_array(const double *ar,int n);
//这样的函数原型意思是不会在函数中改ar数组的值
//那你在外面改呢,随意

const double locked[]={1,2,3,3,4};
const double *pc=locked;//可以
pc=&locked[3];//可以

const double locked[]={1,2,3,3,4};
double *pc;
pc=&locked[3];//不可以

//函数实参也是,有const的数组就别放入没有const的函数里

复习一下数据类型的大小,要不容易搞混

类型 16位 32位 64位
char 1字节 1字节 1字节
*指针 2字节 4字节 8字节
short int 2字节 2字节 2字节
int 2字节 4字节 4字节
long 4字节 8字节 8字节
long long 8字节 8字节 8字节
u int 2字节 4字节 4字节
float 4字节 4字节 4字节
double 8字节 8字节 8字节

可以看出,不同的系统主要是指针大小差距大。。。

当你在储存一个字符的时候,也要用8个字节

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int zippo[4][2]={{2,3},{6,8},{2,7},{9,0}};
**zippo=*zippo[0]=zippo[0][0];
zippo+1=&zippo[1];//注意zippo+1和&zippo[1]只是位置相同,每个单元大小不一
zippo[0]+1=&zippo[0][1];
zipp0[2][1]=7;

//调用
int show_array2(int (*pz)[2],int rows);//指针形式。、
int show_array2(int zippo[][2],int rows);
int show_array2(int [][2],int rows);//省略名字

int *p1;
p1=zippo;//不行
p1-zippo[0];//彳亍
int (*p2)[2];
p2=zippo;//彳亍

int **p3;
p3=zippo;//不行,一个是指向int数字指针的指针,一个是指向数组的指针

复合字面量

是这样的,通常你可以在定义某类型的变量时,直接指定一个值

1
2
3
int i1=5;
char ch='5';
int array[][]={{1,2},{4,7},{9,10}};

那么指针呢,A,是不是尬住了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
#define COLS 4
int sum(const int ar[][COLS],int rows);
int main(void){
int(*pt1)[COLS];
pt1=(int [2][COLS]){{1,2,3,4},{1,3,2,4}};
int total1=sum(pt1,2);
int total2=sum((int[2][4]){{1,5,2,1},{1,2,3,1}},2);
printf("和1=%2d,和2=%2d\n",total1,total2);
return 0;
}
int sum(const int ar[][COLS],int rows){
int tol;
int r,c;
for(r=0;r<rows;r++){
for(c=0;c<COLS;c++){
tol+=ar[r][c];
}
}
return tol;
}