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也可以不輸入)