【嵌入式C语言】06.数组和指针的关系

【嵌入式C语言】06.数组和指针的关系

一、一维数组和指针之间的关系

1.两个重要的结论

结论一:数组名出现在表达式中代表该数组首元素的地址

数组名相当于是个指针,一个指向本数组首元素地址的指针

结论二:

数组名前面&,表示的是指向整个一维数组的一个指针(数组指针)

2.一维数组和指针的关系

2.1 访问数组的方法

第一种:数组名[下标]

a[1];

第二种: *(数组名+1)

*(a+1);

第三种:引入单独的指针,指向数组的首元素

int p=a; //a等价于&a[0]

p[0]; //等价于a[0]

p[1]; //等价于a[1]

*(p+2); //等价于a[2]

2.2 两个指针相减

表示数组中两个指针之间间隔了多少个数据

int a[10]={45,89,96,12};

int *p1=a;

int *p2=&a[7];

p2-p1结果是多少?

注意:经典错误理解成直接用地址值做减法

2.3 关于一维数组名的几种写法

a int *类型的指针

&a 数组指针

a[0] 非指针,数组首元素值

&a[0] 数组首元素的地址

a+1 加类型的大小 4个字节

&a+1 加的是整个数组的大小

a[0]+1 a[0]的值加1

&a[0]+1 加类型的大小 4个字节

二、数组指针和指针数组

1.数组指针(中心词是指针)

1.1 概念

int *p; int类型指针

char *p; char类型指针

数组 *p;数组类型指针 --》数组指针 --》指向某个数组的指针

类型 (*指针名)[数组元素个数]

1.2 如何定义数组指针

int a[10];

char b[15];

int (*p)[10]=&a; //定义了 int[10]类型的数组指针,指向数组a

char (*q)[15]=&b; //定义了 char[15]类型的数组指针,指向数组b

2.指针数组(中心词是数组)

2.1 概念

数组中存放的全部都是指针,这种数组就叫做指针数组

类型 数组名[元素个数]

情况1:类型是指针 --》这种数组叫做指针数组

int *buf[10];

情况2:类型非指针 --》这种数组就是我们前面学习过的普通类型的数组

int buf[10];

int a[10]; //10个int

char b[5]; //5个char

int *c[3]; //3个int *

char *d[4]; //4个char *

2.2 如何定义指针数组

指针类型 数组名[数组元素个数];

三、二维数组和指针之间的关系

1.两个重要的结论

结论一:二维数组名出现在表达式中代表该数组首元素的地址

二维数组名相当于是个指针,一个指向本数组首元素地址的指针

把二维数组理解为特殊的一维数组

比如:char a[3][20]; //理解为包含了3个 char[20]的数组

int b[7][15]; //理解为包含了7个 int[15]的数组

结论二:

二维数组名前面&,表示的是指向整个二维数组的一个指针(数组指针)

2.二维数组和指针的关系

2.1 访问数组的方法

第一种:数组名[下标][下标]

a[i][j];

第二种:引入单独的指针,指向数组的首元素

2.2 两个指针相减

表示数组中两个指针之间间隔了多少个数据

注意:经典错误理解成直接用地址值做减法

2.3 关于有二维数组名的几种写法

a 二维数组首元素的地址 --》 a[0]的地址,数组指针 int (*p)[10]

&a 数组指针 int (*p)[7][10]

a[0] 第一个一维数组int[10]的名字,表示该数组首元素a[0][0]的地址 int *

&a[0] 数组指针 int (*p)[10]

a[0][0] 非指针

&a[0][0] int *

a+1 加类型的大小 int[10]大小

&a+1 加的是整个数组的大小,int[7][10]大小

a[0]+1 4个字节

&a[0]+1 加类型的大小 int[10]大小

a[0][0]+1 把数据加1

&a[0][0]+1 4个字节

指针的类型决定了加减1的步长

我的理解:

练习题

1.计算结果

#include

int main()

{

int x[]={10,20,30};

int *px=x;

printf("%d",++*px);

printf("%d",*px);

px=x;

printf("%d",(*px)++);

printf("%d",*px);

px=x;

printf("%d",*px++);

printf("%d",*px);

px=x;

printf("%d",*++px);

printf("%d",*px);

return 0;

}

2.下面程序的输出是

int main()

{

int a[5]={1,2,3,4,5};

int *ptr=(int *)(&a+1);

printf("%d, %d\n",*(a+1),*(ptr-1))

}

3.下面判断正确的是

A. char *a="china";等价于char *a; *a="china";

B. char str[10]={"china"};等价于char str[10]; str[]={"china"};

C. char *s="china";等价于char *s; s="china";

D. char c[4]="abc",d[4]="abc";等价于char c[4]=d[4]="abc";

C

自己:A的类型不匹配

B的数组名是常量地址不能修改(赋值)

D的数组名是常量地址不能修改(赋值)

4.#include

void main( )

{

int a=99;

int b=99;

char s1[]="Hello World!";

char s2[]="Hello World!";

if(s1==s2 )

printf(“Equal!”);

else

printf(“Not equal!”);

}

Not equal!

5.#include

void main( )

{

char s[]="Hello World!";

char* p = s;

int n=10;

printf("%d %d %d %d\n",sizeof(s),sizeof(p),strlen(p),sizeof(n));

}

13 8 12 4

注意打印类型:sizeof和strlen否用%zu打印!

6.char buf[10]="gecchina";

char *p=&buf[3];

p=p+2;

*p='#';

printf("buf is:%s\n",buf);

printf("p is:%s\n",p);

gecch#na

#na

7.char buf[5][10]={"hello","world","china"};

char *p=&buf[1][3];

char *q=&buf[2][1];

printf("q-p is:%d\n",q-p);