Bootstrap

C语言day09(指针和数组、数组指针、指针数组、命令行参数)

【1】指针和数组

1》直接访问

通过变量的地址存取变量的元素(通过数组名访问)

2》间接访问

通过存放变量地址的变量去访问(通过指针访问)

int a[3] = {1,2,3};
int *p = a;

访问数组a[i]的值:

直接访问:a[i]   *(a + i)

间接访问:*(p + i)  p[i]

访问数组a[i]的地址:

直接访问:a + i    &a[i]

间接访问:&p[i]   p + i

注意:

a  和 p本质不同,a 是数组名,是地址常量,不能为左值,p 是指针变量

【2】指针和二维数组

1》直接访问

二维数组的数组名:第一行的首地址

可以降级  降级到第一行第一列的地址  通过 * (解引用)

a :第一行的地址

*a :第一行第一列的地址

*a + 1 :第一行第二列的地址

访问数组元素的地址:

&a[i][j]    *(a + i) + j      a[i] + j

访问数组元素:

a[i][j]    *(*(a + i) + j)     *(a[i] +  j)

2》间接访问(数组指针)

数组指针:

定义

指向数组的指针,用来存放数组的地址,(本质还是一个指针,行指针)

格式

存储类型   数据类型   (*  数组指针名)[列数];

int a[2][2] = {1,2,3,4};
int (*p)[2] = a;     //定义了一个数组指针 p

p:第一行的首地址    p + 1 :第二行的首地址

p + 1 :移动 8 个字节(列数 * 指针的数据类型的大小)

访问数组元素的地址:

&p[i][j]    *(p + i) + j      p[i] + j

访问数组元素:

p[i][j]    *(*(p + i) + j)     *(p[i] +  j)

数组指针的大小

取决于计算机操作系统的位数

64位    8字节       32位     4字节

【3】指针数组

定义

存放指针的数组,数组中每一个元素都是一个指针(地址),本质是数组

格式

存储类型   数据类型   *  指针数组名 [元素个数]

int *arr_p[5];      //定义了一个指针数组

1》用于存储普通变量的地址

int a =  10, b = 20, c = 30;
int *arr_p[3] = {&a,&b,&c};

访问 a 的地址:arr_p[0]

访问 a 的值 :*arr_p[0]

访问 b 的地址:*(arr_p + 1)

访问 b 的值 : **(arr_p + 1)

2》存放二维数组每一行第一列的地址

int a[3][3] = {1,2,3,4,5,6,7,8,9};
int *p[3] = {a[0],a[1],a[2]};

访问:

第二行第一列的地址:p[1]    *(p + 1)

第三行第二列的元素:*(p[2] + 1)   *(*(p + 2) + 1)

 3》存放多个字符串

char *p[3] = {"hello","world","ak"};

//打印:hello字符串

printf("%s",p[0]);    
printf("%s",*p);          //p[0]、*p 指向‘hello’字符串的首地址

//打印:k字符

printf("%c",*(p[2] + 1));      //第3行第2列
printf("%c",*(*(p + 2) + 1));
printf("%c",p[2][1]);

【4】命令行参数

int main(int argc,char const *argv[])
{

return 0;

}

argc :字符串的个数    传递的数据个数

argv:指针数组      存放字符串

int main(int argc, char const *argv[])
{
    printf("argc=%d    argv[0]=%s   argv[1]=%s\n",argc,argv[0],argv[1]);
    return 0;
}

练习:

输入一个字符串获取字符串中a字符首次出现下标(指针做)

    char a[32] = {};
    gets(a);
    int len = strlen(a);
    char *p = a;
    for(int i = 0;i < len;i++){
        if(*(p + i) == 'a'){
            printf("%d\n",i);
            break;
        }
    }

​​​​​

已知字符数组a[10]b[10]中元素的值递增有序,用指针实现将两个数组中元素按照递增顺序输出。如:char a[10]=”acdgjmno” ; char b[10]=”befhil”;->”abcdefghijlmnos

char a[10] = "befhil";
   char b[10] = "acdgjmno";
   char *p = a;
   char *q = b;
   int m = strlen(a);
   int n = strlen(b);
   while(*p != '\0' && *q != '\0'){
     if(*p > *q){
        printf("%c",*q);
        q++;
    }else if(*p < *q){
        printf("%c",*p);
        p++;
    }
   }
   if(m > n){
      printf("%s",p);
   }else if(m < n){
      printf("%s",q);
   }

;