<24>【掌握】二维数组指针定义、初始化+(游戏推箱子没看)+【理解】字符串指针介绍及使用+【掌握】二维字符数组概念+【理解】字符串指针和字符数组的区别+【理解】字符串数组应用:字符串排序

【掌握】二维数组指针定义、初始化

 

数组指针:

 

    定义一个指针变量,让这个指针变量指向一维数组的元素

 

 

 二维数组指针

 

     行指针,用来指向二维数组的每一行,存放的是行的首地址

    

     定义格式:  数据类型  (*行指针变量名)[数组第二维的长度];

    

 二维数组指针的初始化

 

   int a[2][3];

   int b[2][2];

   float f1[4][4];

 

   //假设我要定义一个指向数组a的一个行指针

   // a  = &a[0]  = &a[0][0]  = a[0]

   int (*p)[3] = a;

 

  二维数组指针的使用

 

    *(*(p+i)+j)  //就是获取二维数组的每个元素

 
 1 #include <stdio.h>

 2 

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

 4     int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

 5     

 6     //二维数组指针

 7     //二维数组指针可以替代数组名去使用

 8     int (*p)[4] = a;

 9   

10     for (int i=0; i<3; i++) {

11         for (int j=0; j<4; j++) {

12             //遍历数组

13             printf("%d\t",*(*(p+i)+j));   //如果是*(*(a+i)+j)可以,因为其是常量,相当于取地址但是你上面 int *p=a;

14         }                                 //这时候下面*(*(p+i)+j)就会报错,因为此时p是一个变量,你*就是取值,定义二维数组指针应该就是解决这个问题
 15 printf("\n"); 16  } 17 18 return 0; 19 }
1    3    5    7    

9    11    13    15    

17    19    21    23    

 

【理解】字符串指针介绍及使用

 

字符串指针:

 

       定义: char *字符串指针变量名 = "字符串内容";

 

       用作:用来保存一个字符串

 
 1 #include <stdio.h>

 2 #include <string.h>

 3 #include <stdlib.h>

 4 

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

 6    

 7     //"zfbanzhang zaiyiqi" 这个字符串存储在常量区

 8     //str 只保存了字符串常量的首地址

 9     char *str = "zfbanzhang zaiyiqi";

10     //指针变量都是占用8个字节

11     printf("sizeof(str) = %ld\n",sizeof(str));

12     printf("str len = %ld\n",strlen(str));

13     

14     //str是指针变量

15     //str重新指向另外一个字符串常量 "I LOVE YOU"

16     //保存的是 "I LOVE YOU" 字符串常量的首地址

17     str = "I LOVE YOU";

18     printf("%s\n",str);

19     

20     char ch[]="abc";  //存在栈区

21     ch[2]='Z';

22     printf("%s\n",ch);

23     

24     //读取字符串常量的某个字符

25     printf("%c\n",*(str+2));  //L

26     for (int i=0; i<strlen(str); i++) {

27         printf("%c\t",*(str+i));

28     }

29     

30     //

31     //*(str+2)='X';  错误的,因为字符串常量是在常量区存储

32     //在常量区保存的数据都是只读的

33     

34     //str2 没有赋初值,野指针

35     char *str2=NULL;

36     //这句话的作用给先申请了100个字节的内存 str2

37     str2 = malloc(100);

38     

39     

40     printf("=======%s\n",str2);

41     

42     //另外一种解决方案                    //本质上上先在内存中先申请空间

43     char ch3[100];

44     char *str3=ch3;

45     scanf("%s",str3);

46     printf("----->%s\n",str3);

47     

48     return 0;

49 }
sizeof(str) = 8

str len = 18

I LOVE YOU

abZ

L

I         L    O    V    E         Y    O    U    =======

 

【掌握】二维字符数组概念

 

    一维字符数组

 

       char  ch[10]={'a','b'};

 

       char ch1[]="abc";

 

 

    二维字符数组

 

       char ch2[3][10]={{'a','b'},{'b'},{'c'}};

 

    用二维数组来保存多个字符串

 

       //用二维的字符数组可以存储多个字符串

       //第一维存的是每个字符串的首地址

       //每个字符串的长度,不能超过第二维长度

       char ch3[3][5]={"abc","def","kkkk"}

  

 

           a  b  c  \0  \0

           d  e  f  \0  \0

           k  k  k  k   \0

 

 

           ch[1][3] = 'Z';       //这样说可以的,因为数据是存在数组里面,不再常量区

 
#include <stdio.h>



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

    

    char ch3[3][5]={"abc","def","kkkk"};

    //存放的是一个二维数组

    ch3[1][3] = 'Z';

    

    for (int i=0; i<3; i++) {

        printf("%s\n",ch3[i]);          //%s的意思就是给定首地址到遇到\0结束

    }

    

    return 0;

}
abc

defZ

kkkk

【理解】字符串指针和字符数组的区别

 

 1 #include <stdio.h>

 2 

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

 4    

 5     //char 类型的指针数组

 6     char *name[3]={"abcdasfadsfasdfasdfasdf","def","kkk"};

 7     

 8     for (int i=0; i<3; i++) {

 9         //name[i]

10         printf("%s\n",*(name+i));      //和printf("%s\n",name[i]);

11     }

12     

13     //字符串指针和字符数组的区别

14     

15     //字符串指针:

16                       char *ss = "abc";

17     

18              //指向可以改变

19             //ss是一个指针变量

20                       ss = "helloWorld!";

21     

22     //字符数组:

23     

24                       char s1[]="abc";

25     //s1是数组名,是一个常量,不能被复制

26                       //s1 = "helloworld!";

27     

28     return 0;

29 }
abcdasfadsfasdfasdfasdf

def

kkk

【理解】字符串数组应用:字符串排序

 1 #include <stdio.h>

 2 #include <string.h>

 3 

 4 /**

 5  *  实现字符串的排序

 6  *

 7  *  @param arr <#arr description#>

 8  *  @param len <#len description#>

 9  */

10 void sortString(char *arr[],int len){

11 

12      //冒泡排序

13      //临时存放地址

14     char *temp;

15     for (int i=0; i<len-1; i++) {

16         for (int j=0; j<len-i-1; j++) {

17             

18             //arr[j]  arr[j+1]

19             //比较字符串大小

20             if (strcmp(arr[j], arr[j+1])>0) {

21                 //实现arr[j]  arr[j+1]交换

22                 temp = arr[j];

23                 arr[j] = arr[j+1];

24                 arr[j+1] = temp;

25                 

26             }

27             

28         }

29     }

30     

31 

32 }

33 

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

35     

36     //输入5个国名并按字母顺序排列后输出。

37     char *name[]={ "CHINA","AMERICA","AUSTRALIA","FRANCE","GERMAN"};

38     

39     for (int i=0; i<5; i++) {

40         printf("%s\n",name[i]);

41     }

42     

43     //字符串排序

44     sortString(name, 5);

45     

46     printf("\n\n");

47     for (int i=0; i<5; i++) {

48         printf("%s\n",name[i]);

49     }

50     

51     

52     

53     int a[2][3]={1,2,3,4,5,6};

54     //p->0x01 1

55     //   0x02 2

56     //   0x03 3

57     //   0x04 4

58     // a = &a[0] = &a[0][0]

59 

60     

61     return 0;

62 }
CHINA

AMERICA

AUSTRALIA

FRANCE

GERMAN





AMERICA

AUSTRALIA

CHINA

FRANCE

GERMAN

 

你可能感兴趣的:(二维数组)