指针数组以及数组指针
来源:互联网 发布:协方差矩阵的计算 编辑:程序博客网 时间:2024/05/20 11:26
首先用几个表达式直观的感受一下什么是指针数组以及数组指针。
一.表达式
int *p[10];//指针数组 int (*p)[10]//数组指针
有了直观的感受那么我们具体分析,指针数组以及数组指针是怎么定义的。
1).指针数组:实质是数组,数组中存放的元素是指针。
2).数组指针:实质是指针,指针变量中存放的是数组首元素的地址。
二.分析小程序理解数组指针
int main() { char a[5] = { 'A', 'B', 'C', 'D' }; char(*p3)[4] = &a; char(*p4)[5] = a; system("pause"); return 0; }
1).编译上述程序
(1).第一个警告告诉我们char (*)[4]和char (*)[5]的数组下标不同,只需要将‘4’改成‘5’即可。
(2).第二个警告告诉我们char (*)[5]与char *的间接级别不同。为什么呢?原因为,字符数组char a[5]的类型的类型是char *,指针指向字符。而char (*p4)[5]的类型是char (*)[5],指针指向数组。
(3).如果要输出(p3+1)的地址呢?会是什么呢?同样我们用代码来分析。
#include<stdio.h> int main() { char a[5] = { 'A', 'B','C','D' }; char(*p3)[5] = &a; //char(*p4)[5] = a;//char(*)[5]和char*的间接级别不同 int size = sizeof(a) / sizeof(a[0]); int i = 0; for (i = 0; i < 6; i++) { printf("%p\n", &a[i]); } printf("++++++%d", size); printf("-------%p\n", p3+1); system("pause"); return 0; }
为了分析我将字符数组的地址也都输出了。并且多输出一块空间以便于分析。我们不难发现(p3+1)的地址是向后整整偏移了一个字符数组的大小,那么我们也就可以理解,数组指针的含义了。
注意:字符数组后面也是有'\0'的!!!不单单是字符串。这一点我们可以用sizeof求数组大小,同时在使用memcpy内存拷贝函数的时候尤为重要。你们肯定会有疑问,内存拷贝函数是以(size_t count)作为拷贝条件,为什么还要有拷入'\0'?原因很简单,如果不将‘\0’拷入的话,结果还是字符串么?能不能正确使用strlrn函数?所以,这就是为什么要将‘\0’拷入的原因了。很重要!
三.自测小程序
#include <stdio.h>int main(){int a[4] = { 1, 2, 3, 4 };int *ptr1 = (int *)(&a + 1);//4int *ptr2 = (int *)((int)a + 1);printf("%x,%x", ptr1[-1], *ptr2);//*(ptr1+(-1))system("pause");return 0;}
输出的是什么?
以上就是本人在学习过程中的一些经验总结。当然,本人能力有限,难免会有纰漏,希望大家可以指正。
本文出自 “做一个小小小司机” 博客,请务必保留此出处http://10799170.blog.51cto.com/10789170/1715728
- 指针数组以及数组指针
- 指针数组,数组指针,以及二维数组
- 数组的指针、指针数组以及指向指针的指针
- 数组的指针、指针数组以及指向指针的指针
- 数组的指针、指针数组以及指向指针的指针
- 数组的指针、指针数组以及指向指针的指针
- C++ 数组指针 指针数组 以及 函数指针 指针函数
- 数组指针和指针数组以及指针的指针
- 指针以及二维数组
- 彻底了解指针数组,数组指针,以及函数指针
- 指针数组、数组指针
- 指针数组/数组指针
- 指针数组/数组指针
- 数组指针 指针数组
- 指针数组,数组指针
- 数组,指针,数组指针
- 数组,指针,数组指针
- 指针数组&数组指针
- 猴子吃桃问题
- 关于字符串的函数
- 函数在实现过程内存中的压栈和出栈
- 内存拷贝函数的实现
- 左旋字符串的三种实现
- 指针数组以及数组指针
- 测试计算机是小端存储还是大端存储
- js 中时间戳转换格式化日期
- 二维数组和二级指针作为参数传给参数的方式
- 理解数组与指针不可缺少的东西
- C#创建使用一般处理程序.ashx
- 用结构体实现一个电话本
- 结构体中的内存对齐
- 输入数字n,按顺序打印出从1到最大的n位十进制数