1 - 指针对应的数组元素ios
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) 数组名[下标]iphone
(2)指针变量名[下标]spa
(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个字节code
4 - 利用指针来接收一个数组,指针变量指向数组的首元素blog
1 void change(int array[]);// 等价于 void change(int *array)
5 - 数组名表明数组的首元地址,它是一个指针常量,指针能够当数组名使⽤,区别是二者在内存中所占字节数不同ip
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);