1. 程式人生 > >C語言學習|指標和陣列(10.21)

C語言學習|指標和陣列(10.21)

基本概念

一維陣列

1.a[i]中,陣列名a代表一維陣列首地址 2.a[i]<->*(a+i)

二維陣列

1.a[i][j]中,a[i]可以看作一維陣列的陣列名,即第i行一維陣列首地址。例:a[i]等價於&a[i][0]。 2.a[i][j]<-> * (a[i]+j)<->* (* (a+i)+j)<-> * (* (a+i)+j)<->( *(a+i))[j]

行指標

int (*p)[4]; //是指向二維陣列的行指標,它所指向的二維陣列每行有4個元素 注意:必須顯式指定指標變數所指向的一維陣列的長度。 初始化方式:p = a; 或者 p = &a[0]; 在這裡插入圖片描述

#include <stdio.h>
#define N 4

void InputArray (int (*p)[N],int m,int n);
void OutputArray (int (*p)[N],int m,int n);

int main()
{
    int a[3][4];
    printf("Input 3*4 numbers:\n");
    InputArray (a,3,4);    //可替換為*a,a[0],&a[0][0]
    OutputArray (a,3,4);

    return 0;
}
void InputArray (int (*p)[N],int m,int n)
{
    int i,j;
    for (i = 0; i < m ; i++)
        for (j = 0; j < n; j++)
            scanf("%d",*(p+i)+j);   //可替換為&p[i][j]
}
void OutputArray (int (*p)[N],int m,int n)
{
    int i,j;
    for (i = 0; i < m ; i++)
        for (j = 0; j < n; j++)
            printf("%4d",*(*(p+i)+j));    //可替換為p[i][j]
    printf("\n");
}

列指標

int *p; 初始化方式:p = a[0]; 或者 p = *a; 或者 p = &a[0][0]; //此時可將a看作是一個由m * n個元素組成的一維陣列。 a[i][j]等價於 * (p+i * n+j) 或 p[i * n+j] 。 &a[i][j]等價於 p+i * n+j 或 &p[i * n+j]。 每次增1減1操作時,移動的位元組數為;基型別所佔位元組數。 常用作函式引數,實現當二位陣列行列數需要動態指令的場合。 注意:此時不能用p[i][j]表示陣列元素,因為此時等價於一維陣列。 在這裡插入圖片描述

#include <stdio.h>

void InputArray (int *p,int m,int n);
void OutputArray (int *p,int m,int n);

int main()
{
    int a[3][4];
    printf("Input 3*4 numbers:\n");
    InputArray (*a,3,4);    //可替換為a[0],a,&a[0][0],均表示第0行第0列的地址
    OutputArray (*a,3,4);

    return 0;
}
void InputArray (int *p,int m,int n)
{
    int i,j;
    for (i = 0; i < m ; i++)
        for (j = 0; j < n; j++)
            scanf("%d",p+i*n+j);
}
void OutputArray (int *p,int m,int n)
{
    int i,j;
    for (i = 0; i < m ; i++)
        for (j = 0; j < n; j++)
            printf("%4d",*(p+i*n+j));
    printf("\n");
}

指標陣列

是一個數組,指標作為陣列的元素,形成了指標陣列,用於表示多個字串。

用途一:對多個字串進行處理操作,加快字串的排序速度。

字串排序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 150
#define MAX_LEN 10

void SortString (char *p[],int n);

int main()
{
    int i,n;
    char name[N][MAX_LEN];
    char *p[N];     //定義指標陣列
    printf("How many countries?");
    scanf("%d",&n);
    getchar();
    printf("Input their names:\n");
    for (i = 0; i < n; i++)
    {
        p[i] = name[i];    //初始化指標陣列p[i],使其分別指向name的每一行
        gets(p[i]);    //對name進行賦值
    }
    SortString (p,n);
    printf("Sorted result:\n");
    for (i = 0; i < n; i++)
        puts(p[i]);

    return 0;
}
void SortString (char *p[],int n)
{
    int i,j;
    char *temp = NULL;
    for (i = 0; i < n-1; i++)
        for (j = i+1; j < n; j++)
        	/*改變指標陣列*p[N]的指向,並沒有改變name[N][MAX_LEN]*/
            if (strcmp(p[i],p[j]) > 0)
            {
                temp = p[i];
                p[i] = p[j];
                p[j] = temp;
            }
}

在這裡插入圖片描述 物理排序:移動字串在實際物理儲存空間中存放的位置而實現的排序。 索引排序:移動字串的索引地址而實現的排序,此方法執行效率更高。

用途二:用於表示命令列引數

#include <stdio.h>
/*argc存放命令列引數個數,argv為字元指標陣列,接收命令列引數*/
int main(int argc,char *argv[])
{
    int i;
    printf("The number of command line arguments is:%d\n",argc);
    printf("The program name is:%s\n",argv[0]);
    if (argc > 1)
    {
        printf("The other arguments are following:\n");
        for (i = 1; i < argc; i++)
        {
            printf("%s\n",argv[i]);
        }
    }
    return 0;
}

假設此檔案為Practice.c,編譯連結後生成可執行檔案Practice.exe 此可執行檔案檔案的位置為E:\CBcode\Practice\bin\Debug\Practice.exe 在執行中,輸入cmd,回車,開啟DOS命令提示符,輸入如下命令列: Practice.exe programming is fun 將顯示如下程式執行結果(.exe也可以不輸入) 在這裡插入圖片描述 在這裡插入圖片描述