C语言学习之二维数组&数组指针

  • 数组指针的格式:
  • 数据类型 (*数组指针变量名)[列宽];
  • 特点:
  • 本质上是一个指针类型的变量;
  • 指向的是一个二维数组,即数组指针的列宽等价于二维数组的列宽;
  • 例如:
int array[2][5] = {1,2,3,4,5,6,7,8,9,10};
int (*p)[5] = array;
  • 指针数组和数组指针的区别:
  • 指针数组本质上是一个数组,每一个元素都是指针类型;
  • 数组指针本质上是一个指针,指向的是一个二维数组;
  • 二维数组名的含义:
  • array:表示二维数组的名字,数组名是一个常量,不可被修改;
  • array + 1:表示向后偏移二维数组的整行;
  • arrray[i]:表示二维数组的行对应的首地址;
  • array[i] + 1:表示向后偏移一个元素的大小;
  • array[1][4]:表示第1行第4列的元素对应的值,等价于*(array[1] + 4)*(*(array + 1) + 4)
  • &array[1][4]:表示第1行第4列的元素对应的地址,且地址为int *类型,等价于*(array + 1) + 4
  • *(array + 1):二维数组名前加*降维成一维数组,表示一维数组的首地址
  • 总结:
  • 取二维数组每个元素的值:
二维数组名[row][col]
*(二维数组名[row] + col)
*(*(二维数组名+row) + col)
  • 取二维数组每个元素的地址:
&二维数组名[row][col]
二维数组名[row] + col
*(二维数组名+row) + col
  • 取二维数组每行的首地址:
二维数组名[row]
*(二维数组名 + row)
  • 二维数组对应的每行的地址:
二维数组名 + row
  • 数组指针变量名的含义:
  • 数组指针变量名表示一个行地址,可以将数组指针变量名当作二维数组名使用;
  • 可以定义一个数组指针变量指向一个二维数组,通过数组指针变量访问二维数组的每个元素;
  • 通过数组指针变量访问指向二维数组的每个元素的值:
数组指针变量名[row][col]
*(数组指针变量名[row] + col)
*(*(数组指针变量名+row) + col)
  • 通过数组指针变量访问指向二维数组的每个元素的地址:
&数组指针变量名[row][col]
数组指针变量名[row] + col
*(数组指针变量名+row) + col
  • 通过数组指针变量指向二维数组的每行的首地址:
数组指针变量名[row]
*(数组指针变量名 + row)
  • 通过数组指针变量指向二维数组的每行的地址:
数组指针变量名 + row
  • 二维数组和指针数组的区别:
  • 相同点:
  • 二维数组名和指针数组变量名都是一个行地址;
  • 可以使用数组指针变量指向一个二维数组;
  • 两者用法基本一致;
  • 不同点:
  • 二维数组名是一个常量,不可被修改;
  • 数组指针变量名是一个变量,可修改数组指针的指向;
  • 总结:
  • 若一个函数的参数是一个二维数组时,一般使用数组指针指向一个二维数组的方式,进行二维数组参数的传递;
  • 测试代码:
#include

void print_array(int (*q)[5], int row, int col){

	for(int i = 0; i < row; i++){

		for(int j = 0; j < col; j++){


			printf("%-3d",*(q[i]+j));
		
		
		
		
		}

		puts("");
	
	
	
	
	}




}

void show_array(int (*q)[5],int row,int col){


	for(int i = 0; i < row; i++){


		for(int j = 0; j < col; j++){


			printf("%-3d",*(*(q + i) + j));
		
		
		
		
		
		}
	    puts("");
	
	
	
	
	}





}



int main(int argc, const char *argv[])
{
    int array[2][5] = {1,2,3,4,5,6,7,8,9,10};
	int (*p)[5] = NULL;

	p = array;

    printf("把指针变量名当作二维数组名使用:\n");
	for(int i = 0; i < 2; i++){


		for(int j = 0; j < 5; j++){


			printf("%-3d",p[i][j]);
			
		}
	    putchar('\n');
	
	}
    puts("--------------------");

	print_array(array,2,5);
    puts("--------------------");
	show_array(p,2,5);

	return 0;
}
  • 运行结果:
把指针变量名当作二维数组名使用:
1  2  3  4  5  
6  7  8  9  10 
--------------------
1  2  3  4  5  
6  7  8  9  10 
--------------------
1  2  3  4  5  
6  7  8  9  10 

你可能感兴趣的:(c语言,学习,算法)