1.数组的创建:
元素类型 数组名 [常量或者常量表达式] 如:int arr1[10];
注:即使是被const修饰的变量也不能作为[]中的内容,它本质上依然属于变量,只是具有常量属性
2.数组的初始化:
创建数组时,若不指定数组大小一定要初始化,但是初始化后可以不指定数组大小
注:(1)字符串放在数组里时,默认最后还有\0,字符数组则不是,有啥放啥
(2)char *p="abcdef",p中放的是'a'的地址,通过这个地址可以找到a,以及a后面的字符
3.下标引用操作符: []
数组通过下标(从0开始)来访问,数组大小计算:len=sizeof(arr1)/sizeof(arr1[0])

4.一维数组在内存中连续存储:用语句printf("&arr1[%d]=%p\n",i,&arr1[i]);来查看各个元素地址
5.指针
(1)32位平台上指针大小为4个字节,64位则是8个字节
(2)指针是一个用来存放地址的一个变量
(3)对于一维数组,除了sizeof(单个数组名)、&单个数组名以外,其它地方出现的都是代表数组首元素地址
(4)获得数组中每个元素地址:A.数组名+整数(首元素地址+整数) B.&arr1[i]
(5)int *p=arr1,arr1+i等价于 p+i,因为p里保存的就是首元素地址arr1,*(p+i)就是元素本身,p[i]也是元素本身,因为p相当于shuzumrr1
6.二维数组的创建和初始化
(1)下标第一项可以省,第二项不能省
(2)也是通过下标来访问
(3)二维数组在内存中也是连续存储的,(只是一行完了再一行)
(4)二维数组arr1[3][4],看成一维数组是三个元素,arr1[0]、arr1[1]、arr1[2],只是这三个元素又是一个数组而已
(5)二维数组arr1[3][4],其中单独的数组名arr1代表的是将其看为一维数组时第一个元素arr1[0]的地址,而仅仅是这个二位数组的首地址应该是&arr1[0][0].
(6)二维数组指针访问更加方便(初始化直接利用指针往后算,输出时还有利用两个for循环有序输出)
7.关于数组的运算
注意:sizeof()求得是变量或者空间开辟空间的大小,而strlen()函数参数接收的必须是一个有效地址
(1)

[cpp] view plain copy

#include <stdio.h>
int main()
{
int a[]={1,2,3,4};
printf("%d\n",sizeof(a)); //16 整个数组大小
printf("%d\n",sizeof(a+0)); //4 首元素地址
printf("%d\n",sizeof(*a)); //4 首元素所占空间大小,1个整型
printf("%d\n",sizeof(a+1)); //4 第二个元素地址大小
printf("%d\n",sizeof(a[1])); //4 第二个元素所占空间大小
printf("%d\n",sizeof(&a)); //4 整个数组地址
printf("%d\n",sizeof(&a+1)); //4 跳到下一个地址开头,但是目前还是4
printf("%d\n",sizeof(&a[0])); //4 首元素地址
printf("%d\n",sizeof(&a[0]+1)); //4 第二个元素的地址
return 0;
}

(2)
[cpp] view plain copy

#include <stdio.h>
int main()
{
int a[]={1,2,3,4};
printf("%d\n",sizeof(a)); //16 整个数组大小
printf("%d\n",sizeof(a+0)); //4 首元素地址
printf("%d\n",sizeof(*a)); //4 首元素所占空间大小,1个整型
printf("%d\n",sizeof(a+1)); //4 第二个元素地址大小
printf("%d\n",sizeof(a[1])); //4 第二个元素所占空间大小
printf("%d\n",sizeof(&a)); //4 整个数组地址
printf("%d\n",sizeof(&a+1)); //4 跳到下一个地址开头,但是目前还是4
printf("%d\n",sizeof(&a[0])); //4 首元素地址
printf("%d\n",sizeof(&a[0]+1)); //4 第二个元素的地址
return 0;
}
注意:只要是地址,不管是整型数组,还是字符数组,只要是32位平台,都是4个字节

(3)

[cpp] view plain copy

#include <stdio.h>
int main ()
{
char arr[]={'a','b','c','d','e','f'};
printf("%d\n",strlen(arr)); //19随机值,不知道什么时候会遇到\0
printf("%d\n",strlen(arr+0)); //19随机值
//printf("%d\n",strlen(*arr)); //系统奔溃,字符a不是一个有效地址
//printf("%d\n",strlen(arr[1])); //系统奔溃,字符a不是一个有效地址
printf("%d\n",strlen(&arr)); //19随机值 先找到整个数组地址,然后从第一个字符往后找,所以和1、2随机数字是一样
printf("%d\n",strlen(&arr+1)); //13随机值,这里因为整个数组地址加1,相当于把它跳过去了,19-6=13(注意)
printf("%d\n",strlen(&arr[0]+1)); // 18随机值,这里因为是从第二个元素地址开始往后找,19-1=18(注意)
return 0;
}

(4)

[cpp] view plain copy

#include <stdio.h>
int main()
{
char *p="abcdef";
printf("%d\n",sizeof(p)); //4 ,p存放首元素a的地址,指针大小都为4
printf("%d\n",sizeof(p+1)); //4,元素b的地址
printf("%d\n",sizeof(*p)); //1,首元素所占空间大小
printf("%d\n",sizeof(p[0])); //1,首元素所占空间大小
printf("%d\n",sizeof(&p)); //4,给指针变量取地址,还是个地址,所以4个字节
printf("%d\n",sizeof(&p+1)); //4,p指向下一个元素的地址(指向b的地址)
printf("%d\n",sizeof(&p[0]+1)); //4 第二个元素的地址
return 0;
}
注意:&和*的区分使用啦

(5)

[cpp] view plain copy

#include <stdio.h>
int main()
{
char *p="abcdef";
printf("%d\n",strlen(p)); //6,p存的是首字符a的地址,从这个入口进去,直到遇到\0结束,(\0不算在内)
printf("%d\n",strlen(p+1)); //5,p+1指向第二个字符,再与第一个一样
printf("%d\n",strlen(*p)); //系统奔溃,字符a不算一个有效地址
printf("%d\n",strlen(p[0])); //系统奔溃,字符a不算一个有效地址
printf("%d\n",strlen(&p)); //随机值,(注意:易错,这里给指针变量取地址还是地址,但是从这个地址开始查找,后面情况就不确定了)
printf("%d\n",strlen(&p+1)); //随机值(问题和上一个一样,只是p指向的元素向后挪了一个)
printf("%d\n",strlen(&p[0]+1)); //5,入口地址从第二个元素开始
return 0;
}

(6)

[cpp] view plain copy

#include <stdio.h>
int main()
{
int a[3][4]={0};
printf("%d\n",sizeof(a)); //48,该数组共有12个元素,每个元素4字节,一个48字节
printf("%d\n",sizeof(a[0][0])); //4,就代表第一个元素所占空间大小
printf("%d\n",sizeof(a[0])); //16 将二维数组看成一维数组,则该数组共有3个元素,a[0]为第一个元素,(即第一行)
printf("%d\n",sizeof(a[0]+1)); //4 a[0]看成一维数组的数组名,代表首地址,再加一,第二个元素地址
printf("%d\n",sizeof(a+1)); //4,a是首元素地址(第一行),加一跳过第一行来到第二行首元素位置(注意:算地址都是4位)
printf("%d\n",sizeof(&a[0]+1)); //4 a[0]是一维数组的数组名,对它取地址代表整个数组,再加一,来到第二行(注意:同上一个)
printf("%d\n",sizeof(*a)); //16 ,a是首元素地址(第一行地址),对其解引用,为第一行
printf("%d\n",sizeof(a[3])); //16 虽然不存在,但是和a[0]一样,有4个元素,每个元素4字节,工16字节
return 0;
}
注意:地址加整数算的还是地址

c语言数组相关的计算的更多相关文章

  1. c语言中数组相关问题

    c语言中数组相关问题: 1.数组基本定义: 相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标.组成数组 ...

  2. 《利用Python进行数据分析·第2版》第四章 Numpy基础:数组和矢量计算

    <利用Python进行数据分析·第2版>第四章 Numpy基础:数组和矢量计算 numpy高效处理大数组的数据原因: numpy是在一个连续的内存块中存储数据,独立于其他python内置对 ...

  3. 《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算

    http://www.cnblogs.com/batteryhp/p/5000104.html 第四章 Numpy基础:数组和矢量计算 第一部分:numpy的ndarray:一种多维数组对象 实话说, ...

  4. TSPL学习笔记(4):数组相关练习

    最近研究函数式编程,都是haskell和scheme交互着看的,所以笔记中两种语言的内容都有,练习一般也都用两种语言分别实现. 本篇练习一些数组有关的问题,之所以与数组相关是因为在命令式编程中以下问题 ...

  5. 不可或缺 Windows Native (5) - C 语言: 数组

    [源码下载] 不可或缺 Windows Native (5) - C 语言: 数组 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 数组 示例cArray.h #ifn ...

  6. python numpy基础 数组和矢量计算

    在python 中有时候我们用数组操作数据可以极大的提升数据的处理效率, 类似于R的向量化操作,是的数据的操作趋于简单化,在python 中是使用numpy模块可以进行数组和矢量计算. 下面来看下简单 ...

  7. C语言数组:C语言数组定义、二维数组、动态数组、字符串数组

    1.C语言数组的概念 在<更加优美的C语言输出>一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下: #include <stdio.h> #include &l ...

  8. Go语言数组的使用

    Go 语言数组 Go 语言提供了数组类型的数据结构. 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 相对于去声明number0 ...

  9. Go语言数组和切片的原理

    目录 数组 创建 访问和赋值 切片 结构 初始化 访问 追加 拷贝 总结 数组和切片是 Go 语言中常见的数据结构,很多刚刚使用 Go 的开发者往往会混淆这两个概念,数组作为最常见的集合在编程语言中是 ...

随机推荐

  1. 1W字看懂互联网知识经济

    互联网知识经济,发生关键变化的不是知识,而是经济. 今天和大家分享方军老师的新书<付费:互联网知识经济的兴起>.这本书是一个老互联网人看新知识经济,很有意思的视角在于,以互联网的发展为节点 ...

  2. Redis安装以及基本操作命令

    Redis安装 cd redis-2.6.14make PREFIX=/usr/local/redis install 可能会出现的错误提示>>提示1:make[3]: gcc:命令未找到 ...

  3. Java企业微信开发_07_总结一下企业微信的配置

    一.企业微信后台 1.回调url 2.可信域名 3.菜单跳转按钮中的链接 4.PC端网页授权 二.代码内 1.企业微信的配置信息:WeiXinParamesUtil

  4. hdu1556Color the ball线段树区间更新

    题目链接 线段树区间更新更新一段区间,在更新区间的过程中,区间被分成几段,每一段的左右界限刚好是一个节点的tree[node].left和tree[node].right(如果不是继续分,直到是为止) ...

  5. OpenCV - Android Studio 中集成Opencv环境(包含opencv_contrib部分)

    我在上一篇博客中说到了在Android中集成OpenCV,但是那个版本的OpenCV是没有SIFT和SURF算法的,因为这些算法是受专利保护的,所以并没有被包含在预编译库中,所以如果想要使用SIFT和 ...

  6. unity渲染层级关系小结

    http://blog.csdn.net/meegomeego/article/details/42060389 最近连续遇到了几个绘制图像之间相互遮挡关系不正确的问题,网上查找的信息比较凌乱,所以这 ...

  7. Bellman-Ford算法及其队列优化(SPFA)

    一.算法概述 Bellman-Ford算法解决的是一般情况下的单源最短路径问题.所谓单源最短路径问题:给定一个图G=(V,E),我们希望找到从给定源结点s属于V到每个结点v属于V的最短路径.单源最短路 ...

  8. Poj 2328 Guessing Game(猜数字游戏)

    一.题目大意 两个小盆友玩猜数字游戏,一个小盆友心里想着1~10中的一个数字,另一个小盆友猜.如果猜的数字比实际的大,则告诉他"too high",小则"too low& ...

  9. .NET接入微信支付(一)JS API接入 V3

    前段时间刚接完银联支付,完事后又接了微信支付,前段时间一直急着上线,微信的接入一直没有时间处理,今天我们就来整理一下微信支付的接入方法和要点. 配置: 首先呢微信支付需要通过审核,审核啥的准备工作我就 ...

  10. Java变量初始化的讲解

    首先需要说明的是Java中的变量分为两种:成员变量和局部变量 其中成员变量又可分为:实例变量(非静态变量)和类变量(静态变量) 局部变量(局部变量的作用时间很短,所以一般是存储在栈中的): 1.形参在 ...