C++数组定义和访问

转自:http://www.cnblogs.com/kykuaileren/archive/2011/09/04/2166646.html

一、数组定义和初始化

   1: 一维数组初始化:
   2: 标准方式一: int value[100]; // value[i]的值不定,没有初始化
   3: 标准方式二: int value[100] = {1,2}; // value[0]和value[1]的值分别为1和2,而没有定义的value[i>1]
   4:                                  // 则初始化为0
   5: 指针方式: int* value = new int[n]; // 未初始化
   6:            delete []value;  // 一定不能忘了删除数组空间
   7:  
   8: 二维数组初始化:
   9: 标准方式一: int value[9][9]; // value[i][j]的值不定,没有初始化
  10: 标准方式二: int value[9][9] = {{1,1},{2}}; //value[0][0,1]和value[1][0]的值初始化,其他初始化为0
  11: 指针方式一: int (*value)[n] = new int[m][n];
  12:              delete []value; // n必须为常量,调用直观。未初始化
  13: 指针方式二: int** value = new int* [m];
  14:              for(i) value[i] = new int[n];
  15:              for(i) delete []value[i];
  16:              delete []value; // 多次析构,存储麻烦,未初始化
  17: 指针方式三: int * value = new int[3][4]; // 数组的存储是按行存储的
  18:              delete []value; // 一定要进行内存释放,否则会造成内存泄露
  19:  
  20: 多维数组初始化:
  21: 指针方式: int * value = new int[m][3][4]; // 只有第一维可以是变量,其他几维必须都是常量,否则会报错
  22:            delete []value; // 一定要进行内存释放,否则会造成内存泄露

数组初始化的大括号后面要加“;”来表示结束。

数组访问:

指针形式:如二维数组value[i][j]的访问:

*(value[i] + j) 或

(*(value + i))[j]

二、数组作为参数传递

   1: 一维数组参数传递:
   2: void Func(int *value);
   3: 或者是
   4: void Func(int value[]);
   5:  
   6: 二维数组传递:
   7: 定义是 int **value;的传递
   8: void Func(int **value);
   9: 定义是 int (*value)[n] = new int[m][n];的传递
  10: void func(int (*value)[n]); // sizeof(p)=4,sizeof(*value)=sizeof(int)*n;

三、数组与指针关系

1、数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;

2、数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;

3、指向数组的指针则是另外一种变量类型,(在win32平台下,长度为4),仅仅意味着数组存放地址。

4、数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针,而且在其失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。

四、数组的存储格式

多维数组在内存中存储时是按照最低维连续的格式存储的,如二维数组{{1,2},{3,4}}在内存中的位置是这样顺序的“1,3,2,4”,这跟matlab是有区别的,matlab是按列进行存储的。在使用指针进行索引时很有用。

五、字符数组

char类型的数组被称作字符数组,通常用来存储字符串。字符串是附加有特殊字符(串尾标志)的字符序列。串终止字符表明字符串已经结束,该字符由转义序列‘\0’定义,有时被称为空字符,占用一个字节,其中8位全为0。这种形式的字符串通常被称为C型字符串,因为以这样的方式定义字符串是在C语言中推出的,在C++一般使用string,而MFC中则定义了CString类。

字符串中每个字符占用一个字节,算上最后的空字符,字符串需要的字节数要比包含的字节数多一个。如:

char movie_star[15] = “Marilyn Monroe”;

这里字符串是14个字符,但是要定义15个字符串的数组。也可以不指定字符数组的个数。如:

char movie_star[] = “Marilyn Monroe”;

六、内存泄露

我们定义了一个指针,然后给它赋予了一个地址值,然后又不再使用,但是没有delete,那么当给指针赋予其他的地址值时,原来的内存将无法释放,这就叫做内存泄露。

时间: 2024-09-27 23:42:50

C++数组定义和访问的相关文章

《从缺陷中学习C/C++》——6.2 数组定义和值初始化形式混淆

6.2 数组定义和值初始化形式混淆 从缺陷中学习C/C++代码示例 int *ip = new int(12); for (int i = 0; i < 12; i++) { ip[i] = i; } delete [] ip;现象&结果产生运行时错误,提示如下的错误信息: glibc detected *** free(): invalid next size (fast) Bug分析int *ip=new int(12)表示new了一个整型变量,值是12.ip指向这个变量. new返回的

《C++覆辙录》——第2章 语法问题2.1:数组定义和值初始化的语法形式混淆

第2章 语法问题 C++覆辙录C++语言的语法和词法结构博大精深.此复杂性的一部分是从C语言那里继承而来的,另一部分则是为支撑某些特定的语言特性所要求的. 本章中我们将考察一组语法相关的头疼问题.其中有些属于常见的手误,但是错误的代码仍然能够通过编译,只不过会以出人意料的方式运行罢了.另外一些则是由于一段代码的语法结构及它们的运行期行为不再互为表里.其余的部分,我们主要研究语法层面的灵活余地带来的问题:明明是一字不差的代码,不同的软件工程师能从中得出大相径庭的结论来. 2.1:数组定义和值初始化

PHP中数组定义的几种方法_php技巧

Array 数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性.由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的. 一般来说定义方法如下面几种: 方法一: $a=array(1,2,4,5,6); <?php $array=array('a','b','c'); $array[]='simon'; pr

processing-java 数组定义,报错:unexpected token: [ 如何解决?

问题描述 java 数组定义,报错:unexpected token: [ 如何解决? RT,代码如下: class Data { String name; int size; int level; int father; int x = 0; int y = 0; int w = 0; int h = 0; Data(String tname, int tsize, int tlevel, int tfather) { name = tname; size = tsize; level = t

swift 数组定义 文档和xcode实际操作不一致,你们有遇到吗

问题描述 swift 数组定义 文档和xcode实际操作不一致,你们有遇到吗 解决方案 xcode是对的,你的文档官方的吗?少了半边不行哦 解决方案二: 看下是不是类型不对,或者不匹配 解决方案三: xcode怎么说你就怎么来吧,一般都是倾向于相信xcode

数组定义不能用常量值

问题描述 数组定义不能用常量值 #include #include #include #include using namespace std; int main() { string str; cout<<"输入字符串" <<"(Crtl+Z退出输入)"< getline(cin,str); const size_t str_size=str.size(); char cha[str_size]; //Erro:不能用常量值 syst

java-JAVA中数组定义new分配内存空间的问题

问题描述 JAVA中数组定义new分配内存空间的问题 JAVA中在定义一个数组的时候,根据书上内容形式,举一个例子 int[] arr=new int[]{3,4,5,}; 但是在实际中,我见到过或者使用更多的是 int[] arr={3,4,5}; 这个时候要不要new去分配内存又有什么区别呢? 在JAVA中 是不是没有new 分配的时候 数组arr在内存栈中 new分配内存空间时 数组arr就到了堆内存中呢 解决方案 现在也不是很理解,找了一个大神告诉我说 第二种是静态初始化,在编译的时候就

link发射属性的时候如何排除一些不要的属性,只查询其中一部分,用数组定义的属性可以么?

问题描述 link发射属性的时候如何排除一些不要的属性,只查询其中一部分,用数组定义的属性可以么? link发射属性的时候如何排除一些不要的属性,只查询其中一部分,用数组定义的属性可以么? 解决方案 string[] excludes = { xxx, xxx, ... }; //不需要的属性 PropertyInfo[] props = typeof(T).GetPropertites(x => !excludes.Contains(x.Name)).ToArray(); ...

关于java数组定义一个函数清除该数组的重复元素,返回一个不能浪费长度的数组.

问题描述 关于java数组定义一个函数清除该数组的重复元素,返回一个不能浪费长度的数组. package cn.xtgj.testarr; /** 目前有数组" int[] arr = {11,2, 4, 2, 10, 11},定义一个函数清除该数组的重复元素,返回一个不能浪费长度的数组. * */ public class Arr { public void method(int[] arr){ int count=0; for(int i=0;i<arr.length;i++){ fo