C语言 - 指针 1.2:指针和数组

指针和数组

1 - 指针对应的数组元素

1     int ages[5]={10,9,8,7,6};
2     int *p = ages;// 等同于:int *p = &ages[0];
3     // 第1个元素的地址 p,&ages[0]
4     // 第2个元素的地址 p+1,&ages[1]
5     // 第3个元素的地址 p+2,&ages[2]
6     // ......

2 -  示例代码:利用指针,遍历出数组元素

1     int ages[5]={101,19,21,33,22};
2     int *p = ages;
3     for(int i=0;i<5;i++)
4         printf("%d\t",*(p+i));
5     printf("\n");

3 - 数组元素的三种访问形式

(1) 数组名[下标]

(2)指针变量名[下标]

(3) *(指针变量+下标)

1     char *arr[4]={"ios","iphone","ipod","abc"};
2     printf("%s \n",arr[1]);// 输出:iphone
3     printf("%c \n",*(*(arr+1)+2));// 输出:h
4     printf("%s \n",arr[2]);// 输出:ipod
5     printf("%c \n",*(arr[2]+3));// 输出:d

注  指针变量的+1或-1究竟是加、减多少?这取决于指针的类型:如果是 char 类型的指针就加1个字节;如果是 int 类型的指针则加4个字节

4 - 利用指针来接收一个数组,指针变量指向数组的首元素

1 void change(int array[]);// 等价于 void change(int *array) 

5 - 数组名代表数组的首元地址,它是一个指针常量,指针可以当数组名使⽤,区别是两者在内存中所占字节数不一样

 1     char string[10] = "iphone";
 2     char *p = string;
 3     printf("%p \n", p);// 输出地址:0x7fff5fbff62e
 4     
 5     *(p+1)='P';// 操作单个字符串
 6     printf("%s\n",p);// 输出:iPhone
 7     printf("%c\n",*p);// 输出:i
 8     printf("%c\n",*(p+2));// 输出:h
 9 
10     p++;//向高位偏移
11     printf("%s \n",p);// 输出:Phone
12     printf("%c \n",*(p+1));// 输出:h
13     printf("%s \n",string);// 输出:iPhone
14     printf("%s \n",string+1);// 输出:Phone

指针和字符串

1 - 比较两行代码有什么不同

1     char name[] = "it";
2     char *name2 = "it";
3     
4     name[0]='g';
5     printf("%s\n",name);// 输出:gt
6 
7     *name2= 'y';// 运行到此句崩溃
8     printf("%s\n",name2);

解析:name 是字符串变量,*name2是字符串常量。C语言的数组元素存放于栈,里面的元素可以随便修改,称为字符串变量;而字符串常量存放于常量区,会缓存起来是不可更改的

1   char *name1 = "it";
2   char *name2 = "it";
3   printf("%p\n%p\n",name1,name2);// 地址是一样的,说明 name1 和 name2 指向的是同一个字符串

指针数组

1 - 定义:以整型数组为例,在这个数组中存放的都是整型,那么指针数组就是在数组中存放的都是指针

1   int ages[5] = {0};
2   char *name[10]={"jack","rose","dany"};// 等同于 char name[3][10] = {"jack","rose","dany"};

2 - 指针数组的重指向

1     char melee[3][20] = {"李小龙","查克·诺里斯","增根泰三"};
2     char *firstFighter[3] = {"fist","foot","waist"};
3     firstFighter[0] = &melee[0][0];// 重新指向
4     printf("%s\n",*firstFighter);// 输出:李小龙

3 -  在控制台中,何输入字符串?(使用数组,为什么?因为可变)

1   char name[20];
2   printf("请输入姓名:\n");
3   scanf("%s",name);
4   printf("您输入的姓名是:%s\n",name);

转载于:https://www.cnblogs.com/self-epoch/p/7100484.html

猜你喜欢

转载自blog.csdn.net/weixin_34112181/article/details/93267479