——黑馬程序員——C語言中的數組(三)

-----------android培訓java培訓、java學習型技術博客、期待與您交流!-----------

指針和二維數組的關係

一、用數組名訪問二維數組

二維數組可以看作是特殊的一維數組
int a[3][4] = { {1,3,5,7}, {9,11,13,15} ,{17,19,21,23} };

 
a代表數組的首地址
a[0]代表數組的第0行的首地址,也代表數組第0列的首地址,它和數組的首地址相同
a[0]+1代表數組的第1列的首地址,  a[0]+1代表第2列首地址   a[0]+j代表列號爲j的列的首地址
a+1代表數組的第1行的首地址 ,a+2代表第2行首地址,a+i代表行號爲i的行首地址(按行變化)
#include <stdio.h>
#include <stdlib.h>
int main()
{
	//定義數組
    int a[3][4] = {{1,3,5,7}, {9,11,13,15} ,{17,19,21,23}};
    //打印二維數組的列指針
    printf("&a[0][0] = %p\n",&a[0][0]);
    printf(" a[0]    = %p\n",a[0]);
    
    printf("&a[0][1] = %p\n",&a[0][1]);
    printf(" a[0]+ 1 = %p\n",a[0]+1);
    
    printf("&a[0][2] = %p\n",&a[0][2]);
    printf(" a[0]+ 2 = %p\n",a[0]+2);
   
    printf("&a[0][3] = %p\n",&a[0][3]);
    printf(" a[0]+ 3 = %p\n",a[0]+3);
    
    //打印行指針 a[0] a[1] a[2]
    //a+1  是第二行的首地址
    //a+2  是第三行的首地址
    printf("a[0] = %p\n",a[0]);    
    printf("   a = %p\n",a);    
    
	printf("a[1] = %p\n",a[1]);
	printf("a +1 = %p\n",a+1);
    
	printf("a[2] = %p\n",a[2]);    
    printf("a +2 = %p\n",a+2);
      
	system("pause");
	return 0;
}

a[i]+j獲取的是a [i] [j]的地址,
*(a[i]+j)獲取的是a [i] [j]的值,加 * 表示取值
a [i]獲取值得方式爲:  * (a+i)
* ( * (a+i)+j );  獲取的是a[i][j]的值
#include <stdio.h>
#include <stdlib.h>
int main()
{
	//定義數組
    int a[3][4] = {{1,3,5,7}, {9,11,13,15} ,{17,19,21,23}};
    int i,j;
    //控制行
    for(i = 0; i < 3; i++)
    {
		//控制列
        for(j = 0; j < 4; j++)
        {
        //打印出數組元素
        printf("%d\t",a[i][j]);
        }
        printf("\n");
    }
      
	system("pause");
	return 0;
}


#include <stdio.h>
#include <stdlib.h>
int main()
{
	//定義數組
    int a[3][4] = {{1,3,5,7}, {9,11,13,15} ,{17,19,21,23}};
    int i,j;
    //定義一個爲數組指針並指向數組a[3][4]
    int (*p)[4] = a;
    //控制行
    for(i = 0; i < 3; i++)
    {
		//控制列
        for(j = 0; j < 4; j++)
        {
        //打印出數組元素
        printf("%d\t",  *(*(a+i)+j));
        }
        printf("\n");
    }
             
	system("pause");
	return 0;
}

二、用普通指針訪問二維數組

此方法不推薦使用,能訪問二維數組是因爲二維數組在內存中存儲的時候是每個元素是逐個線性存儲的,不推薦使用時因爲:定義的是一級指針指向了二維數組
#include <stdio.h>
#include <stdlib.h>
int main()
{
	//定義數組
    int a[3][4] = {{1,3,5,7}, {9,11,13,15} ,{17,19,21,23}};
    int i,j;
    int *p = a;

    for(i = 0; i < 12; i++)
    {
        //打印出數組元素
        printf("%d\t",*(p+i));

    }
     printf("\n");
	system("pause");
	return 0;
}

三、二維數組指針

二維數組指針:指向二維數組的指針,存放的是二維數組的每一行的首地址,二維數組指針是二級指針
一般形式:
數據類型 (*行指針變量名)[數組第二位的長度]
int a[3][4];
int (*p)[4];
表示定義一個二維數組指針,指向含有4個元素的一維數組
p = a;
表示將該二維數組的首地址賦給p,也就是a[0]或者&a[0][0]
p++
可 以讓指針指向數組的每一行
 數組指針也稱指向一維數組的指針,也稱作行指針
#include <stdio.h>
#include <stdlib.h>
int main()
{
	//定義數組
    int a[3][4] = {{1,3,5,7}, {9,11,13,15} ,{17,19,21,23}};
    int i,j;
    //定義一個爲數組指針並指向數組a[3][4]
    int (*p)[4] = a;
    //控制行
    for(i = 0; i < 3; i++)
    {
		//控制列
        for(j = 0; j < 4; j++)
        {
        //打印出數組元素
        printf("%d\t",  *(*(p+i)+j));
        }
        printf("\n");
    }
             
	system("pause");
	return 0;
}

  三、指針數組和二維數組指針的區別

1、int *p[3] = { &a,&b,&c };  p 是一個指針數組,用來存放指針的數組,本質是數組,只不過數組的每個元素是指針變量
2、int (*p)[3] = a;  是二維數組指針,指向二維數組的指針變量,本質是指針,指向的是一個二維數組
3、兩者都可以用來表示二維數組
4、二維數組指針變量是單個的變量,只能存放一個二維數組的地址
5、int (*p)[3];表示是定義一個 二維數組指針,指向了含有3個元素的一維數組
6、指針數組是多個有序指針
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章