对于刚刚见到指针数组的小白而言,需要知道:指针数组是指针?还是数组??
那么请问:热爱学习的你是个好孩子,你你是好呢?还是孩子呢??
答案显而易见:指针数组是个数组!!
由:整型指针 : int * point ;能够指向整型数据的指针!(存放整型变量的地址)
浮点型指针: float *pf ;能够指向浮点型数据的指针!(存放字符变量的地址)
那么:数组指针应该是:能够指向数组的指针!(存放数组的地址)
下面笔者用代码来带领大家分析:
- int a = 10;
- int* p1 = &a;
在上述代码中p1 的类型为:int * ;(去掉名字剩下的就是类型)
因此,对于:
-
- char ch = 'w';
- char p2 = &ch;
在上述代码段中:p2的类型为: char *;(去掉名字剩下的就是类型)
因此对于一个数组:
- int arr[10] = { 1,2,3,4,5 };
- int(*pa)[10] = &arr;
由: &arr 取出的是数组的地址,存放到pa中,pa 是数组的指针变量
*pa :指向10个元素为int类型的数组!
因此:
int(*pa)[10] = &arr;
为数组指针:
数组指针的类型为:int (*)[10];
即:
- int* p[5];
- int(*p)[5];
是两个不同的指针!请大家分清楚!!!
前者为:指针数组,后者为:数组指针!
数组名与&数组名的区别联系
对于数组名,大家并不陌生!
在笔者下面的内容需要用到:数组名是数组首元素的地址!
有俩个列外需要大家注意:(1)sizeof(数组名) 在这里数组名表示整个数组!
(2)&(数组名) 取出的是整个数组的地址!
希望大家谨记!!!
列如:
- int arr[10] = { 0 };
- int(*p)[10] = &arr;
在上述代码段中,&arr 的类型为: int (*)[10] ;是一种指针类型!
数组的地址+1,跳过整个数组的大小!!
言归正传,上面是笔者进行下面代码的基础知识,及其扩展,希望大家认真思考笔者将要进行的内容!
- #include <stdio.h>
- int main()
- {
- int arr[10] = { 0 };
-
- printf("%p\n", arr);
- printf("%p\n", &arr[0]);
- printf("%p\n", &arr);
- printf("\n");
-
- printf("%p\n", arr);
- printf("%p\n", arr+1);
- printf("\n");
-
- printf("%p\n", &arr[0]);
- printf("%p\n", &arr[0]+1);
- printf("\n");
-
- printf("%p\n", &arr);
- printf("%p\n", &arr+1);
-
- }
在上述代码中,代码的内容显而易见,在此笔者就不做过多的讲述!
需要强调的就是:%p是用来打印地址的!!
下面请看笔者的代码运行结果为:
根据代码的运行结果,我们可以看出来:
-
- printf("%p\n", arr);
- printf("%p\n", &arr[0]);
- printf("%p\n", &arr);
运行结果一样!因此地址也是一样的!
- printf("%p\n", arr);
- printf("%p\n", arr+1);
-
-
- printf("%p\n", &arr[0]);
- printf("%p\n", &arr[0]+1);
由地址的最后数字的改变可以看出来:(8——》’C‘(12))跳过了四个字节!一个int !
然而:由:
- printf("%p\n", &arr);
- printf("%p\n", &arr+1);
这个的运行结果:(68——》90)可以看出来:跳过了整个数组的大小!!
所以出现那个运行结果的差距!