数据结构——数组,字符串

版权声明:如引用请注明 https://blog.csdn.net/m0_37730416/article/details/88139682

数据结构——数组,字符串

数组、字符串是两种最基本的数据结构,使用连续内存分别存数字和字符,并按照顺序存储

数组

特点

  • 数组在创建时需要指定大小,按大小分配内存,因此空间效率较低,常有空闲区域未利用。由于数组内存连续,可根据下标在*O(1)*时间进行读写,因此时间效率高。
    (PS:利用时间效率的特性可以实现简单哈希表Hash table,下标为key value,所存数字为value)
    为解决空间问题又有动态数组,如STL的vector,创建时开辟较小空间,然后添加数据,当数据数目超过容量时,再分配更大的空间(vector是新容量为之前的两倍),然后将数据复制到新的空间,再把之前的内存释放。使用时应减少改变数组容量大小的次数以避免额外操作降低时间效率。
  • 数组名是指针,指向数组第一个元素,c/c++不记录数组大小,应防止指针越界。数组名与指针的区别可由**sizeof()**体现出来。1.直接对数组名用sizeof(),返回数组大小。2.对同样指向数组的指针用sizeof(),返回指针大小(32位系统下大小为4)。3.当数组作为参数进行传递时,数组退化为同类型指针,sizeof()会返回指针大小。
  • 不允许把数组拷贝给别的数组作初始值,也不允许将数组拷贝给其他数组。 所以数组传参时不可能出现拷贝传参,只能是引址传参。数组的复制需要逐位进行,字符数组相当于字符串,复制可以用标准函数strcpy()和strncpy()直接进行字符串复制。
  • 数组使用++/–有如下:二者功能相同,这里注意运算符++和–的使用,单独使用时放在操作数前后效果一样,参与运算使用:当++在变量后面(i++),会先将变量中的值取出做赋值操作,再自身+1;++在变量前面(++i),会先自身+1,然后再将+1后的结果赋值。
str[indexOfNew --] = str[indexOfOriginal];
str[indexOfNew] = str[indexOfOriginal];
indexOfNew --;
  • 数组作为形参的传递:传的都是指针
    1.一维数组作形参,实参传数组名
bool duplicate(int numbers[], int length, int* duplication){}
...
int numbers[];
bool validInput = duplicate(numbers, lengthNumbers, &duplication);

2.一维数组,形参为同数据类型指针,实参传数组名

void test(const char* testName, int* numbers, int length, int* duplications, int dupLength){}
...
int numbers[] = { 2, 3, 5, 4, 3, 2, 6, 7 };
test("test1", numbers, sizeof(numbers) / sizeof(int), duplications, sizeof(duplications) / sizeof(int));

3.二维数组,形参为同数据类型指针,实参传将数组名强制类型转化成的同类指针

void Test(char* testName, int* matrix, int rows, int columns, int number, bool expected){}
...
int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
Test("Test1", (int*)matrix, 4, 4, 7, true);

4.二维数组,形参为给定第二维长度的二维数组,实参为数组名

void Test(int matrix[][4], int rows, int cols, int num){}
...
int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
Test(matrix, 4, 4, 7);

5.二维数组,形参为指向数组的指针(数组指针)并给出数组长度,实参为数组名

void Test(int (*matrix)[4], int rows, int cols, int num){} // 数组指针
...
int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
Test(matrix, 4, 4, 7);

6.二维数组,形参为指针的指针,实参必须为指针数组(元素为指针的数组)。在函数中使用传参过来的二维数组(指针)进行数组取值的时候不能使用(array[ i ][ j ])这种形式来取值。应该将二维数组看成一个一维数组,使用array[i * j + j]这种形式来进行取值。

void Test(int **matrix, int rows, int cols, int num){}
...
int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
int* array[4]; // 指针数组
array[0] = matrix[0];
array[1] = matrix[1];
array[2] = matrix[2];
array[4] = matrix[4];
Test(array, 4, 4, 7);

附:
数组指针(也称行指针)
定义 int (*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]

所以数组指针也称指向一维数组的指针,亦称行指针。

指针数组
定义 int p[n];
[]优先级高,先与p结合成为一个数组,再由int
说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]…p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 p=a; 这里p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:
int *p[3];
int a[3][4];
p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
for(i=0;i<3;i++)
p[i]=a[i]
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
所以要分别赋值。

经典题目(一维数组)

剑指offer 面试题3(P39)数组中重复的数字
tips 用下标定位元素,利用这一特性可交换数据到与下标对应的位置;与二分查找结合考察,熟悉二分查找的写法。

int start = 1; // attention
int end = length - 1;
while(end >= start) 
{
	int middle = ((end - start) >> 1) + start;
	...
	if (count > (middle - start + 1))
		end = middle;
	else 
		start = middle + 1;
}

经典题目(二维数组)

剑指offer 面试题4(P44)二维数组中的查找

  • 二维数组在内存中占据连续空间,在内存中从上到下存储各行元素,同行中按照从左到右的顺序存储,因此根据行号和列号计算相对于数组首地址的偏移量。
    matrix[row * columns + column]
    tips 从右上角或左下角开始找。

字符串

C/C++中每个字符串以字符’\0’作为结尾,因此字符串有一个额外字符,不留神容易造成字符串越界。
C/C++把常量字符串放到一个单独的内存区域,当几个指针赋值给相同的常量字符串时,他们实际上会指向相同的内存地址。 例如,

char* st3 = "hello world";
char* st4 = "hello world";

st3和st4中所存地址相同。并且在上述字符指针的char*复制字符串常量时,不可用指针st3,st4改变该常量的值。

  • 对于字符数组,printf和cout可以通过数组名输出整个字符串,不需要 *加字符数组名
char* testName;
printf("%s begins: ", testName); // 而不是 *testName

字符数组、字符指针的字符串会有要考虑内存释放是否足够、字符串
长度等的问题
,因此使用时可以考虑使用STL库中的string

猜你喜欢

转载自blog.csdn.net/m0_37730416/article/details/88139682