03 C Pointer&Array

指针和数组

指针访问一维数组

  1. 通过数组名下标访问
scanf("%d", &a[i]);
printf("%d", a[i]);
  1. 通过数组名解引用访问
scanf("%d", a+i);
printf("%d", *(a+i));
  1. 通过指针变量下标访问
int *p; p = a;
scanf("%d", &p[i]);
printf("%d", p[i]);
  1. 通过指针变量解引用访问
int *p;
for (p = a; p < (a + 10); p++)
{
    scanf("%d", p);
    printf("%d", *p);
}
//for(p=a+10;a<p;a++) 错误

指针访问二维数组

  1. 行指针,类型为数组指针int (*)[]

​ 行指针每加一,指向后一行

a+i代表第i行首地址

  1. 列指针,类型为整型指针int *

​ 列指针每加一,指向后一列

a[i]*(a+i)代表a[i][0]地址

a[i]+j*(a+i)+j代表a[i][j]地址

  1. 数组元素,类型为整型

a[i][j]*(a[i]+j)*(*(a+i)+j)代表元素a[i][j]

  1. 指针变量可以指向二维数组元素

​ 二维数组的元素在内存中按行顺序存放,可用一个指针变量依次遍历

int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int *p;
for (p = a[0]; p < a[0] + 12; p++)
{
    printf("%4d", *p);
    if ((p - a[0] + 1) % 4 == 0) printf("\n");
}
  1. 数组指针变量可以指向数组中的一行
int a[3][4] = { 1,3,5,7,9,11,13,15,17,19,21,23 };
int (*p)[4], i, j;
p = a;
printf("enter row and colum:");
scanf("%d,%d", &i, &j);
printf("a[%d][%d] = %d\n",i,j,*(*(p + i) + j));
  1. 二维数组行地址作为函数参数
int maxVal(int (*array)[4], int m) { 
    int i, j, max = array[0][0];
    for (i = 0; i < m; i++)
        for (j = 0; j < 4; j++)
            if (array[i][j] > max)
                max = array[i][j];
    return max;
}

字符数组

  1. 字符串可以存放在一个字符数组中,例如:char a[] = "string"

​ 也可以存放在一个字符串常量中,例如:const char *s = "string"

字符串常量不能更改 例如:char *b = "china"; b[4] = 'e';//wrong

  1. 用指针变量访问字符串常量
const char* a = "i love china!";
//不能改为 char a[]="i love china!";
a = a + 7;
printf("%s\n", a);
  1. 用指针变量访问不同字符串常量
const char* string = "i love china!";
printf("%s\n", string);
string = "i am a student.";
printf("%s\n", string);
  1. 字符串复制
void str_cpy(char* dest, const char* src)
{
    int i = 0;
    while (src[i] != '\0')
    {
        dest[i] = src[i];
        i++;
    }
    dest[i] = '\0';
}
void str_cpy(char* dest, const char* src) {
    for (; *src != '\0'; src++, dest++)
        *dest = *src;
    *dest = '\0’;
}
  1. 字符串连接
void str_cat(char* dest, const char* src)
{
    int i, j;
    for (i = 0; dest[i] != '\0'; i++)
        ;
    for (j = 0; src[j] != '\0'; i++, j++)
        dest[i] = src[j];
    dest[i] = '\0';
}

指针数组

  1. 指针数组:元素是指针类型的数组
#include <stdio.h>
#include <string.h>
void sort(char* name[], int n);
void print(char* name[], int n);
int main() {
    char* name[]={"write","computer","program","compile"};
    sort(name, 4);
    print(name, 4);
    return 0;
}
void print(char** name, int n)
{
    int i;
    for (i = 0; i < n; i++)
        printf("%s\n", name[i]);
}
void sort(char** name, int n) {
    char* temp;  int i, j, k;
    for (i = 0; i < n - 1; i++)   {
        k = i;
        for (j = i + 1; j < n; j++)
            if (strcmp(name[k], name[j]) > 0) k = j;
        if (k != i)  {
            temp = name[i]; name[i] = name[k];
            name[k] = temp;
        }
    }
}

小技巧

  1. 形参数组可再被赋值
void f(int a[100], int n)
{
    printf("first element is %d,", *a);
    a = a + n - 1;//形参数组可以被再赋值
    printf("last element is %d\n", *a);
}
  1. 利用指针输入字符串到一个数组
char str[10];
char *a;
a = str;
scanf("%s", a);
  1. 数组指针与指针数组
  • 数组指针:指向数组的指针 int (*p)[5];

  • 指针数组:元素为指针的数组 int * p[5];

posted @ 2025-04-11 16:33  YamadaRyou  阅读(12)  评论(0)    收藏  举报