目录
基于for循环
一维数组
二维数组理解
c语言的null和c++的null
基于for循环
for(ELEMTYPE val:array){
}
ELEMTYPE:是范围变量的类型。通常使用auto自动转换范围变量类型
val:范围变量的名称。通过迭代依次接收数组中的元素值
array:容器,注意这里的array必须是一个容器空间。
int main() {
int ar[] = { 1,2,3,4};
for (int& x : ar) {
cout << x << endl;
}
for (int x : ar) {
cout << x << endl;
}
}//打印结果都是1,2,3,4
注意:一个是普通变量:通过迭代将ar[i]的值取出来赋值给x,然后输出
另外一个是引用:x是ar的别名,如果x+10那么ar数组也会随之发生改变。
一维数组
int a0,a1,a2,a3;
int*p0,*p1,*p2,*p3;
int**s;
p0=&a0;
p1=&a1;
p2=&a2;
p3=&a3;
s=&p0;
sizeof(s);
s+1;//4 int**
*s+1;//4 int*
**s+1;//4 int
s+1---->s是一个二级指针,s+1说明指针指向p1这个一级指针,偏移量是指针类型四字节
*s+1---> *s解引用变成一级指针,一级指针+1代表p0这个一级指针刚开始存储a0这个整型变量的地址,+1后就是a1这个变量的地址,偏移量是int类型,四字节
**s+1---> * *s解引用两次变成a0,+1操作即给a0自身加一
int ar0[4],ar1[4],ar2[4];
int(*p)[4]=&ar0;
p+1--->4*4=16个字节
p:&ar0 p+1--->4*4=16
*p:&ar0[0] *p+1--->4
数组首元素的地址和数组的地址都是从ar0[0]处开始 值是相等的但是意义不相同,+1偏移量不同
通过p指针修改ar1[2]的值
/* (*(p+1)+2) 就行==>p [1] [2];
p+1-->指针由ar0指向ar1 ,*(p+1)指针指向数组ar1中的元素, *(p+1)+2指针就指向ar1[2],通过解引用对值进行修改
二维数组理解
二维数组由多个一维数组构成
int br[3] [4]={1,2,3,4,5,6,7,8,9,10,11,12};
int(*p)[3] [4]=&br;
int (*s)[4]=br;--->一维数组的内容了
#include<iostream>
using namespace std;
int main(){
int ar[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
for(auto x:ar){//ar[0]
cout<<x<<endl;
}
}
如果按照上述方法打印二维数组将会得到三个一维数组的地址,因为基于范围的for是将ar[i]提取出来,依次迭代,由于上述二维数组是一个三行4列即由三个一维数组构成,所以打印的三个一维数组的地址
正确方法:
#include<iostream>
using namespace std;
int main(){
int ar[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
for(auto &x:ar){//ar[0]依次迭代
for(auto val:x){//ar[0][0]依次迭代
cout<<x<<endl;
}
}
}
c语言的null和c++的null
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
在c++中NULL的值是0,所以无法判断空指针是指针还是整型0
所以c++使用nullptr这个关键字来代表指针空值