指针与数组
数组的特点:
- 类型一样
- 内存连续分布
- 初始化的时候必须知道大小(编译器可以帮我们数),否则报错(编译器不会让通过的)
由于数组元素内存连续分布,很符合指针的运算,所以可以说数组和指针是天生的好朋友
指针在数组上的应用
遍历一维数组
#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
int a[5] = {1,2,3,4,5};
int *p = a;
for (int i = 0; i < sizeof(a)/sizeof(int); i++, p++)
{
cout << *p << endl;
}
p = NULL;
return 0;
}
/*
1
2
3
4
5
*/
行指针遍历二维数组: 二维数组在底层是一个连续的内存单元,并没有行列之分
#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
//等价于int a[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
cout << *(*(a+i)+j) << endl;
}
}
return 0;
}
/*
1
2
3
4
5
6
7
8
9
10
11
12
*/
用数组名 列指针遍历二维数组
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
//定义指针
int *col = a[0];//col是某行某列的指针 把第一行地址赋值给指针col
for(;col<a[0]+12; col++){
//地址每次循环+1指向下一行一列
if( (col-a[0])%4==0 && col!=a[0]){
printf("\n");
}
printf("%d ", *col);
}
printf("\n");
return 0;
}
/*
1 2 3 4
5 6 7 8
9 10 11 12
*/
用指针 列指针遍历二维数组
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int *p = *a;
int *arr = *a;//二维数组首地址等同于 int *arr = fa[0]
for(;arr<p+12; arr++){
//地址每次循环+1指向下一行一列
if( (arr-p)%4 == 0 && arr!=p){
printf("\n");
}
printf("%d ", *arr);
}
printf("\n");
return 0;
}
/*
1 2 3 4
5 6 7 8
9 10 11 12
*/