这是一个大一的学生问我的问题,当时竟然搞糊涂了!!!
1 #include <stdio.h> 2 int main() 3 { 4 char str[ ][10]={"China","Beijing"}; 5 char *p; 6 p = str[0]; 7 printf("%s\n",p+10); 8 while(1); 9 return 0; 10 } 11 /* 12 p输出china 13 p+1输出hina 14 ………… 15 P+4输出a; 16 从P+5到p+9,无输出 17 p+10输出beijing 18 */ 19
1 //指向二维数组行的指针变量 ,使用行地址,即p+1是str[1] 2 #include <stdio.h> 3 int main() 4 { 5 char str[ ][10]={"China","Beijing"}; 6 char (*p)[10];//p是指针,指向含有10个char型元素的一位数组 7 p = str;//不是str[0] ,也不能是&str[0][0] ,可以使&str[0] 8 printf("%s\n",p+1);//输出beijing 9 while(1); 10 return 0; 11 }
1 //指向二维数组的指针,使用列地址,即p+1是str[0][1] 2 #include <stdio.h> 3 int main() 4 { 5 char str[ ][10]={"China","Beijing"}; 6 char *p; 7 p = str[0]; 8 printf("%s\n",p+1);//输出hina 9 while(1); 10 return 0; 11 }
综上:str和str[0],str+1和str[0]+1的值虽然相同,但是意思却截然不同,一个是行地址,一个是列地址,也就是说相应指针执行加一操作时,1所代表的字节数是不一样的.
1 //使用二级指针 2 #include<stdio.h> 3 #define SIZE 5 4 int main( ) 5 { 6 char *pc[]={" Beijing", "Shanghai", "Tianjing", "Guangzhou", "Chongqing" }; 7 char **p; 8 int i; 9 for ( i=0; i<SIZE;i++) 10 { 11 p = pc+i; 12 printf ("%s\n", *p); 13 } 14 while(1); 15 return 0; 16 }
使用上面的传参时,fun(char *str[])
//指向字符数组的指针变量 char str[20]={"abcdef"};//定义时初始化,否则只能用输入函数了 。可以省略20,直接str[]={"abcde"} char *p; p = str;//&str[0]也可 使用for(i=0;p[0]!='\0';i++)即可遍历
//指向字符串常量的指针变量 char *p = "abcde";//定义时初始化,只是将字符串的首地址给了p,c中没有字符串变量 等价于 char *p; p = "abcde"; 输出时直接printf("%s\n",p); 从第二位 printf("%s\n",p+1);
综上:可以看出使用字符串指针比较方便,也比较安全。
1 //指针数组 2 #include <stdio.h> 3 int main() 4 { 5 static int a[3][3]={1,2,3,4,5,6,7,8,9}; 6 int *p[3] = {a[0],a[1],a[2]}; 7 for(int i=0;i<3;i++) 8 printf("%d ",*p[i]);//每行的第一个元素 9 printf("\n"); 10 while(1); 11 return 0; 12 } 13
时间: 2024-10-28 19:09:06