指针与二维数组
<span style="font-size:18px;">#include <stdio.h>
int main()
{ char str[ ][10]={"China","Beijing"};char *p;p = str[0];printf("%s\n",p+10);while(1);return 0;
}
/*
p輸出china
p+1輸出hina
…………
P+4輸出a;
從P+5到p+9,無輸出
p+10輸出beijing
*/</span>
<span style="font-size:18px;">//指向二維數組行的指針變量 ,使用行地址,即p+1是str[1]?
#include <stdio.h>
int main()
{?char str[ ][10]={"China","Beijing"};char (*p)[10];//p是指針,指向含有10個char型元素的一位數組?p = str;//不是str[0] ,也不能是&str[0][0] ,可以使&str[0]?printf("%s\n",p+1);//輸出beijing?while(1);return 0;
}
</span>
<span style="font-size:18px;">//指向二維數組的指針,使用列地址,即p+1是str[0][1]?
#include <stdio.h>
int main()
{?char str[ ][10]={"China","Beijing"};char *p;?p = str[0];printf("%s\n",p+1);//輸出hinawhile(1);return 0;
}
</span>
綜上:str和str[0],str+1和str[0]+1的值雖然相同,但是意思卻截然不同,一個是行地址,一個是列地址,也就是說相應指針執(zhí)行加一操作時,1所代表的字節(jié)數是不一樣的.
//使用二級指針?
#include<stdio.h>?
#define SIZE 5
int main( )
{?
? ? ?char *pc[]={" Beijing", "Shanghai", "Tianjing", "Guangzhou", "Chongqing" };
? ? ?char **p;
? ? ?int i;
? ? ?for ( i=0; i<SIZE;i++)
? ? ?{?
? ? ? ? ? p = pc+i;
? ? ? ? ? printf ("%s\n", *p);
? ? ?}
? ? ?while(1);
? ? ?return 0;
}
使用上面的傳參時,fun(char *str[])
?| 1 2 3 4 5 | //指向字符數組的指針變量 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總結
- 上一篇: C++中输入输出的十六进制八进制
- 下一篇: 纯虚函数