关于C语言中数组指针中的数组指针该如何理解(代码详解)

采用类比和等效法解决一个数组指针在指向数组中的元素时,又指向了一个p[size]数组理解
  • 代码例图
	char *lines[5] =       //数组指针
    {
     
		"COSC1283/1984",
		"Programming",
		"Techniques",
		"is",
		"great fun"
    };
	
    char c2    = (*lines + 5)[5];
    printf("c= %c \n",c2);//输出9
    
  • 首先 lines 是一个char型数组指针,lines 代表了首元素地址---->{“COSC1283/1984”};解一层索引 *lines ,指针指向了首元素C的地址,(*lines +5)指针向后移动5位,指向了字符 ‘2’,此时可以把(*lines +5)等效成一个指向2的指针===》p,故(*lines + 5)[5]可以等效为p[5],p起始位置是字符’2’地址,等效成char *p[5]{“283/19”},此时是求p[5],字符‘2’下标是0,下标5对应元素为9,故答案9就是这么来的。

  • 注意点
    数组符号【】其实起到的是解引用的作用,类似于指针的 * ,故p[5]它包含了两个作用:第一个是p指针向后移动了5位,来到了字符9这个位置,然后【】解字符9的地址值,根据地址值指向拿到了字符9,就像平常数组我们通过下标拿值一样,在内存中每个数组都是有一个地址值的,我们要拿到数值只能通过地址值来去取,而平时数组取值我们是用arr[下标]这样方式取值,这其实经历着解地址值,通过地址值拿到数值的过程。

  • 类比数组

	int arr[] = {
      1, 3, 5, 7, 9};
	printf("%p\n",arr+4 );//0x7fff2306d010
	printf("%d\n",arr[4]);//9
    printf("%d\n",*(arr+4));//9

从当面代码的结果我们验证了我们的说法:数组下标[ ]起到解引用作用,*(arr +4)== arr[4];回到我们的原始问题,p[5]拿到字符9是不是也是一个道理呢,p是个指针,它指向了字符9的地址,通过p[ ]方式解索引拿到数值的逻辑是正的。

你可能感兴趣的:(c++,c语言)