C++ 数组、二维数组、函数参数
程序员文章站
2024-01-09 22:57:16
一维数组: 二维数组: 数组与函数: 补充: ......
一维数组:
1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 /**为了方便 数组的类型全部都是int类型的*/ 6 int numbers[5] = {1,2,3,4,5}; 7 /**通过指针的方式访问数组*/ 8 int * p = numbers; 9 cout << "普通指针的方式访问:\n"; 10 for (int i = 0; i < 5; i++) 11 cout << p[i] << " "; 12 cout << endl; 13 /** 14 在这里面numbers 被解释为数组的第一个元素的地址 即 &numbers[0] 而且还是一个常量 15 也有特殊的情况,例如:sizeof numbers是数组大小 16 */ 17 cout << "数组大小:"; 18 cout << sizeof numbers << " Byte.\n";// 5 * 4 19 /**通过数组指针的方式访问数组 20 数组的地址是 &numbers NOTE:这和numbers值是一样的!!! 21 也就是说相同的地址 你可以用普通的指针指向 也可以用数组指针指向 22 区别就在于他们的指针运算 23 */ 24 int (*p2)[5] = &numbers;//把数组的numbers替换成(*p2)就是 数组的指针了 25 cout << "指针数组的方式访问:\n"; 26 for (int i = 0; i < 5; i++) 27 cout << (*p2)[i] << " "; 28 cout << endl; 29 /** 30 int * p 和 int (*p2)[5] 的区别 31 区别在于他们的指针运算 32 这里不明白的去百度 指针运算 33 */ 34 cout << "p = " << p << endl; 35 cout << "p + 1 = " << p + 1 << endl;//4Byte 36 cout << "p2 = " << p2 << endl; 37 cout << "p2 + 1 = " << p2 + 1 << endl;//20 Byte 38 /**提到 数组指针 就必去提到另一个知识点 指针数组 39 数组指针 是 指针 40 指针数组 是 数组 41 定义的时候 二者通常会混淆 42 */ 43 int * p3[5];//指针数组 每一个元素 都是指针 44 for (int i = 0; i < 5; i++) 45 p3[i] = (*p2) + i;//p2是数组指针 常作为二维数组的指针使用 46 cout << "我也不知道这是什么操作:\n"; 47 for (int i = 0; i < 5; i++) 48 cout << *p3[i] << " "; 49 cout << endl; 50 return 0; 51 }
二维数组:
1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 int data[3][5] = 6 { 7 {1,2,3,4,5}, 8 {9,8,7,6,5}, 9 {1,9,9,5,1} 10 }; 11 /**二维数组的本质是 数组的数组、 12 第一维数组是3个一维数组的地址、第二维就是普通的数组*/ 13 int * p[3] = {data[0], data[1], data[2]}; 14 cout << "地址:\n"; 15 for (int i = 0; i < 3; i++) 16 cout << p[i] << " "; 17 cout << endl; 18 /**常规方式访问二维数组*/ 19 cout << "常规方式访问二维数组\n"; 20 for (int i = 0; i < 3; i++) 21 { 22 for (int j = 0; j <5; j++) 23 cout << data[i][j] << " "; 24 cout << endl; 25 }cout << endl; 26 /**用指针数组尝试访问一下*/ 27 cout << "用指针数组皮一下\n"; 28 for (int i = 0; i < 3; i++) 29 { 30 for (int j = 0; j < 5; j++) 31 cout << p[i][j] << " ";//这里之所以能访问是因为size是int 32 cout << endl; 33 }cout << endl; 34 /**用数组指针 35 int data[3][5] 的第一个元素就是data[0]那么他的 地址就是&data[0] 等价于data 36 前面说过data是属于的第一个元素的地址, 而且还是一个常量 37 那么问题来了 指向&data[0]的指针是什么样子的? 38 data[0] 的类型是int[5] 那么 39 &data[0] 的类型就是 int (*)[5] 40 */ 41 int (*p2)[5] = data; 42 cout << "用数组指针访问\n"; 43 for (int i = 0 ; i < 3; i++) 44 { 45 for (int j = 0; j < 5; j++) 46 cout << p2[i][j] << " ";//这里参考一维数组的数组指针就能理解了 47 cout << endl; 48 }cout << endl; 49 return 0; 50 }
数组与函数:
1 #include <iostream> 2 using namespace std; 3 void print1(const int * p, int len); 4 void print2(const int p[], int len); 5 void print3(int p[][5], int len);//don't use const DON'T!!! 6 void print4(int (*p)[5], int len);//don't use const DON'T!!! 7 int main() 8 { 9 int numbers[5] = {1,2,3,4,5}; 10 int data[3][5] = 11 { 12 {1,2,3,4,5}, 13 {5,6,7,8,9}, 14 {9,8,7,6,5} 15 }; 16 print1(numbers, 5); 17 print2(numbers, 5); 18 print3(data, 3); 19 print4(data, 3); 20 return 0; 21 } 22 void print1(const int* p, int len) 23 { 24 cout << "print1\n"; 25 for (int i = 0; i < len; i++) 26 cout << p[i] << " "; 27 cout << endl; 28 } 29 void print2(const int p[], int len) 30 { 31 cout << "print2\n"; 32 for (int i = 0; i < len; i++) 33 cout << *(p + i) << ' '; 34 cout << endl; 35 } 36 void print3(int p[][5], int len) 37 { 38 cout << "print3\n"; 39 for (int i = 0; i < len; i++) 40 { 41 for (int j = 0; j < 5; j++) 42 cout << p[i][j] << ' '; 43 cout << endl; 44 }cout << endl; 45 } 46 void print4(int(* p)[5], int len) 47 { 48 cout << "print4\n"; 49 for (int i = 0; i < len; i++) 50 { 51 for (int j = 0; j < 5; j++) 52 cout << p[i][j] << ' '; 53 cout << endl; 54 }cout << endl; 55 } 56 /** 57 []([0]) 和 * 是相同的 58 * 就是[0] 59 p[5] 可以写成 * (p + 5) 60 p[5]实际做的事情就是先寻址然后在取值的过程 61 谭浩强老师在他的书里面讲过 62 */
补充:
1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 /** 6 const int * p 和 int * const p的区别 7 */ 8 int a = 10; 9 const int b = 20; 10 const int * p1;// *p1 is read-only 11 p1 = &a; 12 cout << "p1 = " << p1 << endl; 13 cout << "&a = " << &a << endl; 14 cout << "*p1 = " << *p1 << endl; 15 //ERROR *p1 = 23; 16 p1 = &b;// p1 is not read-only 17 cout << "p1 = &b\n"; 18 cout << "*p1 = " << *p1 << endl << endl; 19 20 int * const p2 = &a;// p2 is read-only and must init it 21 //int * const p2 = &b;不匹配 因为没有保护数据 22 //const int * const p2 = &b; 这样可以 23 cout << "p2 = " << p2 << endl; 24 cout << "*p2 = " << *p2 << endl; 25 int c = 1222; 26 // p2 = &c; erro p2 is read-only 27 *p2 = 1234567; 28 cout << "*p2 = " << *p2 << endl; 29 cout << "p2 = " << p2 << endl; 30 return 0; 31 }
下一篇: Dart 运算符、条件判断、类型转换