C++学习 - 数组指针/指针数组

虽然我一直知道它们两个的区别,但是分不清名字应该是叫哪个。 这里区别一下。

指针数组( array of pointers )

顾名思义:这是个数组,数组里面的元素都是指针。

int *arr[10];

这个等同于 int *(a[4])因为*的优先级比较低,所以没有括号的时候,是arr和[10]先结合,变成一个数组,然后这个数组的元素是整型指针。

初始化

这个初始化要按照数组的方式来。

for ( int i = 0; i < 10; i++){
    a[i] = (int *)malloc( 5 * sizeof(int) );
}

这样就是循环遍历每一个数组元素,对给指针申请空间,每个指针都指向一个具有5个int大小的内存。

这个时候,你就可以赋值了。

for ( int i = 0; i < 10; i++){
    for (int j = 0; j < 5; j++){
        a[i][j] = 0;
    }
}

这个时候就把所有元素都赋值为0了。

注意:因为数组的每个元素都是一个指针。所以当你访问a[0][6]的时候是不会报错的。但是输出的值是未定义的,比较危险。

数组指针 ( a pointer to an array )

这个就是说我是一个指针,指针指向了一个数组。

int (*arr)[10];

这里让*和arr结合,成为一个指针,这个指针指向了一个int型的具有10个元素的数组。

初始化

对于这个的初始化我个人认为相对不好理解。

第一中初始化方法:

int temp[4][10] = {};
//方法1
int (*arr)[10] = temp; // 正确
//方法2
int (*array)[10];
array = temp; //正确
//方法3
int (*array_m)[11], (*array_n)[9];
array_m = temp; // error
array_n = temp; //error
//方法4
for( int i =0;i < 4; i++){
    arr = &temp[i]; // 正确
    arr++;
}
arr -= i; // 一定要减去i 才能回到最初始的位置。

在这里只有方法1, 2, 4是正确的,3里面的两种都会报错。

这里重点说一下方法4. 为什么arr++会直接接收下一个int [10],是因为arr是指向一个int [10]的数组,也就是说当arr++的时候,这个指针会向前移动10个int的长度的内存。

总结

以上就是区别了。我平时基本上在二维数组里只用指针数组,很少用数组指针。

因为指针数组比较好理解,但是大家尽量要注意边界问题。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-30 22:36:27

C++学习 - 数组指针/指针数组的相关文章

C和指针 学习笔记-3.数组与指针

数据名代表首地址 指向数组的指针 #include <stdio.h> extern void iterate(int *p); void main(){ int a[]={1,2,3,4,5}; iterate(a); } void iterate(int *p){ int i; for(i=0;i<5;i++){ printf("%d",*p++); } } 指向一维数组的指针 int (*p)[3] #include <stdio.h> void i

【C语言学习】指针再学习(二)之数组的指针

★一维数组 一个整型数据为4个字节.4个字节就是32位,即可以表示2^32个数字 在程序中定义一个数组a[5] = {1,2,3,4,5}; 那么a[0]的地址就是0x00000000,数组名a是数组首元素的地址,a的地址也是0x00000000.a+1则表示的地址是0x00000004,而不是0x00000001.因为1这个值,根据前面的指针a所指向的类型的长度来调整自己的长度.也就是说如果a是指向整型的指针,那么后面加的1也表示4个字节,如果a是指向字符型的指针,那么后面加的1表示1个字节.

数组与指针学习笔记

1.数组初始化说明 (1).在函数体外定义的内置数组,其元素均被初始化为0: (2).在函数体内定义的内置数组,其元素无初始化: (3).类类型的数组自动调用默认构造函数进行初始化,如果无默认构造函数,则必须为该素族元素提供显示初始化. 2.指针的定义 double *p_dbData1, p_dbData2; p_dbData1为指向double类型的指针,p_dbData2为类型为double的对象,若两个变量都定义为double指针,则如下所示: double *p_dbData1,  *

C语言基础学习3:数组与指针

数组元素的指针就是数组元素的地址. 1.指向数组元素的指针 C语言规定数组名(不包括形参数组名,形参数组并不占据实际的内存单元)代表数组中的首元素(即序列为0的元素)的地址. int a[10]; int *p1,*p2; p1 = &a[0]; p2 = a; p1和p2指向同一个数组a[10]. 2.通过指针引用数组元素 按C语言的规定,如果指针变量p已指向数组中的一个元素,则p+1指向同一个数组中的下一个元素,而不是将p的值(地址)简单的加1. 如果p的初值为&a[0],则 (1)

C语言基础学习8:指针数组

一个数组,若其元素均为指针类型数据,称为指针数组,指针数组中的每一个元素都相当于一个指针变量. 一维指针数组的定义形式为: 类型名 *数组名[数组长度]: 例如:int *p[4]; []的优先级比*高,因此p先与[4]结合,形成p[4]形式,这是数组形式,然后再与p前面的"*"结合,"*"表示此数组是指针类型的,每个数组元素都可指向一个整型变量. 为什么要用到指针数组呢? 因为它比较适合于用来指向若干个字符串,使得字符串处理更加灵活. 1 #include <

C语言学习_数组与指针2

数组其实是一种变相的指针,数组名同时也是指针,eg: CODE == &CODE[0]; 数组的加法: #include<stdio.h> #define SIZE 4 int main(void) { shortdates[SIZE]; short* pti; shortindex; doublebills[SIZE]; double* ptf; pti= dates;//把数组地址付给指针 ptf= bills; printf("%23s  %10s\n", &

&lt;深入理解C指针&gt;学习笔记和总结 第四章 指针和数组

数组是一个什么玩意: 数组和指针我的理解,有相同之处也有不同之处.因有相同之处,因此一些资料上说,数组和指针本质是相同的.因有不同之处,因此也有一些资料上说,数组和指针是不一样的. 相同之处: 数组名字和指针名字都代表了一个地址. 如:int num[10];num是数组名.函数开辟了一个存储十个整数类型的空间,而num是他们的首地址. int *p; p=(int *)malloc(10*sizeof(int));类似的,p也指向了首地址. 不同之处是,num[10]中的空间位置是在栈中,而

【C语言学习】《C Primer Plus》第10章 数组和指针

学习总结 1.数组初始化方式: int a[]={1,2,3} int a[SIZE]={1,2,3} //SIZE是宏定义,数组初始化个数不能大于SIZE,否则报错:当个数小 //SIZE,自动补0:只定义不初始化,默认值是当前存储单元中已有的数值. int a[SIZE/不定长]={1,[3],2} //C99支持通过[int]=x来定义具体位置值,跳过的默认值为0. 2.通过const修饰的数组为只读数组,数组的每个元素当成常量来处理,如: const int a[2]={1,2}; co

《C++ Primer》学习 之 返回数组的引用(返回数组的指针,方法与之相同)

/* 返回数组的引用(返回数组的指针,方法与之相同) 共四种方法(在下面示例程序中,调用其中一种方法时,需要将其他三种方法注释掉)*/ 1 #define _CRT_SECURE_NO_WARNINGS 2 #define HOME 3 #include <iostream> 4 #include <stdexcept> 5 #include <ctype.h> 6 #include <locale> 7 #include <iterator>

C语言学习笔记--指针和数组的关系

1.数组的本质 (1)数组是一段连续的内存空间 (2)数组的空间大小:sizeof(array_type)*array_size; (3)数组名可看做指向数组第一个元素的常量指针 (4)数组声明时编译器自动分配一片连续的内存空间 ,而指针声明时只分配了用于容纳地址值的 4 字节空间 2.指针的运算 (1)指针是一种特殊的变量,与整数的运算规则为: p + n == (unsigned int)p + n * sizeof(*p); 当指针 p 指向一个同类型的数组的元素时,p+1 指向当前元素的