我是靠谱客的博主 欢喜钢笔,最近开发中收集的这篇文章主要介绍数组是数组!指针是指针!它们完全不同!,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

#include <stdio.h>
/* book1 程序员面试宝典
* book2 王道程序员求职宝典
*
* 数组和指针的区别与联系:
*
1. 先要分清,数组是数组,指针是指针,这是两个截然不同的概念
* 分清概念后,那么以下情形就不难理解:
* 在test.h中声明extern int *a,但是在test.c中使用ina a[]会编译错误,
* 因为数组和指针是两个概念,声明了指针却定义数组当然会报错!
* 2. 数组保存数据,自身即为数据名.而指针保存数据的地址,指向匿名数据
* 数组名和指针名都是一个地址,而指针值代表这个地址里存储的值
* 对地址可以进行直接引用,对指针只能进行间接引用
* 如 char *p1 = "1234";char p2[] = "1234";
* 假设p1地址为0x1234,p2地址为0x5678,"1234",p1指向字符串常量的地址为0x6666(注意区分两个字符串的地址,是不同的)
* p1[3]和p2[3]取得的值是一样的,但取得方式却不同
* p2是通过p2的地址直接增加+3来得到的,0x5678+3
* 而p1却首先要得到p1地址里的值,即0x6666,然后进行0x6666+3
//详细参见c专家编程 第四章
*
* 但数组和指针有以下联系:
*
除了a被用作运算符sizeof的参数这一情形,
* 在其他所有的情形中数组名a都代表指向数组a中下标为0的元素的指针.
//from C陷阱和指针 p36
* int a[3];
* 所以a的类型是int*, &a的类型是int (*)[3]
* 又如 int calendar[12][31]
* calendar[4]的类型是 int(*)[31],&calendar的类型是int (*)[12][31]
* &calendar[12]等于&*(calendar+12),calendar+12是int (*)[31],解引用后类型为int [31],取址后类型为int (*)[31]
*
* 试试看:
*
以下测试你能做对吗?
*/
int main(){
}
void test1(){
//book2 p15 Q3
int a[] = {1,2,3,4,5};
int *ptr = (int*)(&a+1);
printf("%dn", *(ptr-1));
}
void test2(){
//book2 p15 Q4
int a[2][2][3] = { { {1,2,3}, {4,5,6} }, { {7,8,9}, {10,11,12} } };
int *ptr = (int *)(&a+1);
printf("%d, %dn",*(int*)(a+1), *(ptr-1));
}

最后

以上就是欢喜钢笔为你收集整理的数组是数组!指针是指针!它们完全不同!的全部内容,希望文章能够帮你解决数组是数组!指针是指针!它们完全不同!所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部