有一个例子,一维数组arr1,一维字符串str1;然后将两个数组指针放入到void*数组中arr-1。
一维数组arr2,一维字符串str2;然后将两个数组指针放入到void*数组中arr-2。
再将两arr-1和arr-2指针放入到数组二重指针中arr。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// 梁笔记 // https://zouzhongliang.com #include <iostream> #include <set> using namespace std; int main() { int arr1[5] = {1,3,5,7,9}; char str1[6] = "hello"; int arr2[5] = {2,4,5,8,10}; char str2[6] = "world"; void* arr_1[2] = {arr1,str1}; void* arr_2[2] = {arr2,str2}; void** arr[2] = {arr_1,arr_2}; } |
问题:用arr来访问,arr1/str1/arr2/str2中的数值。
有几个难点,指针:二重指针、一重指针、一维数组
二重指针:它指向的值还是指针
一重指针:它指向的值可以解引用*,得到数值,但一定要知道指针的类型。不然编译器元法知道如何解析的哪段内存。
一维数组:就是一段连续的内存,数组名也是数组头指针。
将上面代码画分成图形,应该会很清楚的知道在内存中的状态
0x:表示地址值
数组与指针来访问的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// 梁笔记 // https://zouzhongliang.com #include <iostream> #include <set> using namespace std; int main() { int arr1[5] = {1,3,5,7,9}; char str1[6] = "hello"; int arr2[5] = {2,4,5,8,10}; char str2[6] = "world"; void* arr_1[2] = {arr1,str1}; void* arr_2[2] = {arr2,str2}; void** arr[2] = {arr_1,arr_2}; cout<< ((int*)(arr[0][0]))[0]<<endl; //1 cout<< ((int*)(arr[0][0]))[1]<<endl; //3 cout<< ((char*)(arr[0][1]))[1]<<endl; //e cout<<((int*)(arr[1][0]))[3]<<endl; //8 cout<<((char*)(arr[1][1]))[4]<<endl; //d } |
注:arr[][]? 这样就是来确定要访问的地址,再将指针转成对应类型指针int* char*,再用下标访问元素。