目录
数组和指针的关系
一维数组和指针的关系: int a[5] = {1,43,5,3,2,};
数组的数组名a是指向数组第一个元素a[0]的指针常量;
a == &a[0];
a的地址可以理解为int *类型: 有两种情况除外:
1,sizeof运算时
2,&运算时,是值不变类型升级为
数组指针
&int * == int **
& int a[] == int (*a)[]
对数组指针取*,值不变,类型降级成为指向数组第一个元素的指针。
访问下标为n的数组元素的方式:a[n] == *(a+n) == p[n]
p[n]就是p+n再取*
int a[5]就是开辟20个字节连续的空间,地址是0x2000 类型就是int *
**一维数组的传参:**数组传参 int a[5] = {1,43,5,3,2,};
int fun(int *a,int len);
**字符串传参:**char a[32] = {"hello world"};
和一维数组传参相似
数组指针:
int *a[5] = {NULL};*和int连用,是5个元素每个元素是int *型类型。
定义一个数组,数组占四十个字节,每个元素为int *型,共五个指针。
int (*a)[5] = NULL;
定义一个指针变量,占八个字节空间,指针指向了一个int类型五个元素的数组,将来+1就会偏移20个字节
数组和指针的关系代码
"sadfghj",一串字符串常量默认类型是char *型
用%p打印上述字符串,打印出来的是上述字符串内存的首地址
字符串常量不能改变值,要不然会崩掉
bash
char str[10] = {"dfg"};
char *pstr = "sdf";
*str = 'S';
//是可以的,因为dfg存在str数组指针中中
*pstr = 'S';
//是不可以的的因为sdf只是将这传字符串的首地址存在pstr指针中,
*pstr不可以直接改变'sdf'常量会崩溃。
指针数组
int (*a)[];
char *a[5]
bash
char *a[5] = {"sddsaf","sdf","ds","ad","fd"};
//相当于是定义了五个数组指针,存了这五个字符串的
首地址,这五个字符串也是常量不能更改内容。
打印:
printf("%s",s[i]);
指针数组主要是用来操作字符串数组,通过将指针数组的每个元素存放字符串的首地址实现多个字符串的操作
二维数组主要用来存放字符串数组,每行存储一个字符串,多行存储多个字符串所组成的数组。
指针和二维数组的关系
bash
int a [2][3] = {0};
int *p = NULL;
int (*q)[3] = NULL;
p = &a[0][0];
p = a[0];
p = *a;
q = a;
//二维数组的数组名是指向第一行元素的数组指针
a+1是直接加一整列的数据内存大小
//访问二维数组第m行第n列的方式
a[m][n];
*(a[m]+n);
*(*(a+m)+n);
*(p+m*N+n);
*(*(a+m)+n);
*(q[m]+n);
q[m][n];
数组传参
bash
int outputarray(int (*p)[3],int len)
int [2][3];
outputarray(a,2);
//数组传参只需要穿数组指针类型和数组行数即可