C++ 一维数组 二维数组 指针

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 一维数组 二维数组 指针相关的知识,希望对你有一定的参考价值。

1、
int a[3] = {1, 2, 3}
a代表数组的首地址
&a[0]也是数组的首地址

2、
// int a[2][2] = {0, 1, 2, 3};

// **a 就是 a[0][0] 第一行第一列。
// *(*a + 1) 就是 a[0][1] 第一行第二列。
// **(a + 1) 就是 a[1][0] 第二行第一列。
// *(*(a + 1) + 1) 就是 a[1][1] 第二行第二列。

3、
int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};//相当于是
a[0][0]=1;
a[0][1]=2;
a[0][2]=3;

4、
数组指针
int (*ptr)[3] = a; //正确。
上面这句代码的意思是,定义一个数组ptr,维数是一维数组,元素是3个,并且定义的是一个指针,指向这个数组的首地址,所以可以把a赋值的,因为a是数组的首地址

5、
指针数组
指针数组,就是存放指针的数组,数组里的元素是指针(对比于整型数组,整型数组就是存放整型的数组,数组里的元素是整型)
int *ptr[3];如何理解?按照运算符优先级,[]优先级较大,所以ptr先与[3]结合,表示ptr是一个数组,必然要明确数组的元素类型,所以数组里的元素类型是整型指针(int*),数组的大小不一定需要(定义数组时可以根据初始化的元素个数确定)
ptr[0]就是数组的第零个元素,它是一个整型指针。
示例如下:
1
2
3
4
int a[3] = {1, 2, 3};
int x = 5;
ptr[0] = &x;
ptr[1] = &a[2];
2.如何使用?
像一般指针一样使用。*ptr[0]就是第零个元素(一个指针)所指向元素的值,这里是 5。

6、数组指针
#include "stdafx.h"
int main(int argc, char* argv[])
{
int iArr[2][3]={0,1,2,3,4,5};
int *p=iArr[0];//二维数组的首地址
printf("%d \n",p);//1638192
printf("%d \n",iArr);//1638192
	printf("%d ",p[1]);
printf("%d\n",*(p+1));//1
	printf("%d ",p[2]);
printf("%d\n",*(p+2));//2
	printf("%d ",p[3]);
printf("%d\n",*(p+3));//3

int(*pArr)[3]=iArr;//这句代码的意思是,一个指针,指向三个整型元素 会有多行多列
printf("%d\n",*(pArr));//1638192 1638196 1638200 1638204
printf("%d\n",*(pArr+1));//1638204
	printf("%d\n",*(*(pArr)));//0
printf("%d\n",*(*(pArr+1)));//3
printf("%d ",*(*(pArr+1)+2));//5

getchar();
return 0;
}
7、一维数组 二维数组 初始化
#include "stdafx.h"
int main(int argc, char* argv[])
{
int test[3][3];
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
printf("%d ",test[i][j]);
}
printf("\n");
}
//-858993460 858993460 858993460
//-858993460 858993460 858993460
//-858993460 858993460 858993460
	int test2[3][3]={0};
for(int i1=0;i1<3;i1++)
{
for(int j1=0;j1<3;j1++)
{
printf("%d ",test2[i1][j1]);
}
printf("\n");
}
//-0 0 0
//-0 0 0
//-0 0 0
	int test3[3];
for(int hh=0;hh<3;hh++)
{
printf("%d ",test3[hh]);
}
printf("\n");
printf("\n");
//-858993460 858993460 858993460
	int test4[3]={0};
for(int hh1=0;hh1<3;hh1++)
{
printf("%d ",test4[hh1]);
}
printf("\n");
printf("\n");
//0 0 0
	getchar();
return 0;
}

8、sizeof 数组 指针
sizeof 数组不会退化为指针
#include "stdafx.h"
int main(int argc, char* argv[])
{
    //此时,传递的数组名不再是指针的作用了
int test[]={0,1,2,3,4,5};
int *p=test;
printf("test 占用的字节数:%d\n",sizeof(test));//24 占用了24个字节
printf("test 占用的字节数:%d\n",sizeof(&test));//24 占用了24个字节
printf("p 占用的字节数:%d\n",sizeof(p));//4 指针占用4个字节

     int test2[20]={0,1,2,3,4,5};
printf("test2 占用的字节数:%d\n",sizeof(test2));//80 占用了80个字节

getchar();
return 0;
}

9、strlen 数组 指针
strlen 数组会退化为指针
#include "stdafx.h"
#include <string.h>
int main(int argc, char* argv[])
{
char *p="123456";
printf("%d\n",strlen(p));//6
	char test[20]={1,2,3,4,5,6};
printf("%d\n",strlen(test));//6
	char test1[]={1,2,3,4,5,6};
printf("%d\n",strlen(test1));//14
	char test2[2]={0};
printf("%d\n",strlen(test2));//0
	char test3[2];
printf("%d\n",strlen(test3));//4
	char test4[20];
printf("%d\n",strlen(test4));//24
	char test5[20]={1};
printf("%d\n",strlen(test5));//1
	char test6[20]={0};
printf("%d\n",strlen(test6));//0
	getchar();
return 0;
}
10、指针 数组 作为参数传递
#include "stdafx.h"
#include <string.h>
//处理数组
void ProcessArray(char arrary[])
{
printf("%s\n",arrary);//我的
}
//处理整型数组
void ProcessArray(int arrary[])
{
printf("%d\n",arrary[0]);//我的
}
//处理指针
void ProcessPointer(int *p)
{
printf("%d\n ",*(p+1));
}
//处理引用
void ProcessRef(int &p)
{
printf("%d\n ",p);
}
 
int main(int argc, char* argv[])
{
char a[10]={"我的"};
int test[10]={0,1,2,3,4,5};
int *p=test;
int k=5;
ProcessArray(a);//我的
ProcessArray(test);//0
	ProcessPointer(p);//1
	ProcessRef(k);//5
	return 0;
}


以上是关于C++ 一维数组 二维数组 指针的主要内容,如果未能解决你的问题,请参考以下文章

c++用啥表示二维数组的一个数

c++二维数组和二级指针

如何利用memcpy将二维指针复制给一维指针?

指针与一维数组和二维数组以及字符串指针数组的学习笔记

我可以使用 C++ 中的指针访问二维数组的元素吗?

C++ 数组(及二维数组)与指针(互转遍历),数组与引用