5、指针数组
指针数组就是数组里存放的是指针。
#include <stdio.h>
int main(void){
int i;
char x[10]="ABCDEFGHIJ";
char *p_x[10];
for (i=0;i<10;i++){
p_x[i]=x+i;
//p_x[i]=&x[i];
}
for (i=0;i<10;i++){
printf("%c ",*p_x[i]);
}
return 1;
}
上面定义了一个指针数组,数组的每个元素都是指针,每个指针指向x数组的相应元素。
其中,p_x为指针数组,通过for循环中的p_x[i]=x+i完成指针数组每个元素的赋值。这里也可以写成p_x[i]=&x[i]。最后以数组下标的方式访问数组,输出元素。
我们让这个程序更复杂一些,加入指针的指针。
定义pp_x,让它指向指针数组的第一个元素,然后向后移动指针,输出元素。源程序如下:
#include <stdio.h>
int main(void){
int i;
char x[10]="ABCDEFGHIJ";
char *p_x[10];
for (i=0;i<10;i++){
p_x[i]=x+i;
}
char **pp_x=NULL;
for (i=0;i<10;i++){
printf("%c ",*p_x[i]);
}
printf ("\n");
for (pp_x=p_x;pp_x<(p_x+10);pp_x++){
printf("%c ",**pp_x);
}
return 1;
}
运行程序
myhaspl@myhaspl:~ % make
cc test4.c -o mytest
myhaspl@myhaspl:~ % ./mytest
A B C D E F G H I J
A B C D E F G H I J
最后我们定义一个更复杂的例子,指针的指针的数组,名字有些长。在例子的最后代码使用了指向指针的指针的指针***ppp_x,用它来最后输出10个元素中的5个元素(每隔一个元素输出一个元素。类似的还使用temp_x,原理类似。
myhaspl@myhaspl:~ % vim test4.c
//code:myhaspl@qq.com
#include <stdio.h>
int main(void){
int i;
char x[10]="ABCDEFGHIJ";
char **pp_x[5];
char *p_x[10];
for (i=0;i<10;i++){
p_x[i]=x+i;
}
char ***temp_x=pp_x;
for (i=0;i<10;i+=2){
*temp_x=&p_x[i];
temp_x++;
}
printf ("\n");
char ***ppp_x;
for (ppp_x=pp_x;ppp_x<(pp_x+5);ppp_x++){
printf("%c ",***ppp_x);
}
return 1;
运行程序
myhaspl@myhaspl:~ % make clean
rm mytest
myhaspl@myhaspl:~ % make
cc test4.c -o mytest
myhaspl@myhaspl:~ % ./mytest
A C E G I 程序每隔一个元素对x数组的内容进行输出。
5、函数参数中使用指针
指针也是一种变量,其实,C语言的函数还是传值,所谓传址只是把指针值传给函数而已,本质上仍然是传值,如下面程序,交换两个数字
#include <stdio.h>
int main(void){
int result;
int x=50;
int y=30;
myswap(&x,&y);
printf("x:%d-y:%d\n",x,y);
}
int myswap(int *a,int *b){
int temp=*a;
*a=*b;
*b=temp;
}
~
运行后,X和Y的值交换了。
myhaspl@myhaspl:~ % make clean
rm mytest
myhaspl@myhaspl:~ % make
cc test5.c -o mytest
myhaspl@myhaspl:~ % ./mytest
x:30-y:50
myhaspl@myhaspl:~ %
我们定义一个数组,然后将数组指针做为参数进行传递。
下面是一段程序完成参数数组中所有元素之和。
#include <stdio.h>
int x[5]={1,2,3,4,5};
int main(void){
int result;
result=mysum(5,x);
printf("%d\n",result);
}
int mysum(int length,int *data){
int myresult=0;
int i;
for(i=0;i<length;i++){
myresult+=*(data+i);
}
return myresult;
}
~
运行结果如下:
myhaspl@myhaspl:~ % make clean
rm mytest
myhaspl@myhaspl:~ % make
cc test6.c -o mytest
myhaspl@myhaspl:~ % ./mytest
15
myhaspl@myhaspl:~ %
多维数组指针
指针是一个变量,它指向另一个变量的地址,指针本身的大小相同,但它指向变量的大小不一定相同,比如说char指针和int指针就不一样,32位系统中,char指针指向的变量仅有1字节,而int指针指向的变量有4个字节,这意味着将char指针指向int指针将有风险,值将被截断。比如:
//code:myhaspl@qq.com
#include <stdio.h>
int main(void){
char *i;
int x=127;
i=(char*)&x;
printf("%d",*i);
return 1;
}
上面程序中当x值可用1个字节容纳时,程序运行正常。
myhaspl@myhaspl:~ % ./mytest
127myhaspl@myhaspl:~ % make
cc test5.c -o mytest
myhaspl@myhaspl:~ % ./mytest
127
但当x值较大时(不在-128~127以内),就会出问题:
//code:myhaspl@qq.com
#include <stdio.h>
int main(void){
char *i;
int x=250;
i=(char*)&x;
printf("%d",*i);
return 1;
}
myhaspl@myhaspl:~ % make
cc test5.c -o mytest
myhaspl@myhaspl:~ % ./mytest
-6m
多维数组的指针定定义比一维数组更录活,因为它可以指定指向变量的最后一维的维数,下面定义的指针指向变量的大小是最后一维的5个元素,每次指针移动都以5个元素为单位:
//code:myhaspl@qq.com
#include <stdio.h>
int main(void){
int i;
int x[2][5]={1,2,3,4,5,6,7,8,9,10};
int (*p_x)[5];
for (p_x=x;p_x<=(&x[1]);p_x++){
printf("%d ",*p_x[0]);
}
return 1;
}
myhaspl@myhaspl:~ % make
cc test6.c -o mytest
myhaspl@myhaspl:~ % ./mytest
1 6
下面定义的指针仅指向一个元素 ,也通过改变指针指向变量的尺寸,将数组以5*2大小的方式进行访问,这样,编译器会给出警告,但能编译通过。
//code:myhaspl@qq.com
#include <stdio.h>
int main(void){
int i;
int x[2][5]={1,2,3,4,5,6,7,8,9,10};
int (*p_x)[2];
for (p_x=x;p_x<&x[1][5];p_x++){
printf("%d ",*p_x[0]);
}
return 1;
}
myhaspl@myhaspl:~ % cc test8.c -o mytest
test8.c: In function 'main':
test8.c:7: warning: assignment from incompatible pointer type
test8.c:7: warning: comparison of distinct pointer types lacks a cast
myhaspl@myhaspl:~ % ./mytest
1 3 5 7 9
并不赞成这种做法,如果需要每隔2个元素进行访问,可以将指针指向多维数组的一个元素,每次移动加上2即可。
//code:myhaspl@qq.com
#include <stdio.h>
int main(void){
int i;
int x[2][5]={1,2,3,4,5,6,7,8,9,10};
int *p_x=&x[0][0];
for (;p_x<&x[1][5];p_x+=2){
printf("%d ",*p_x);
}
return 1;
}
myhaspl@myhaspl:~ % cc test7.c -o mytest
myhaspl@myhaspl:~ % ./mytest
1 3 5 7 9
©著作权归作者所有:来自51CTO博客作者myhaspl的原创作品,如需转载,请注明出处,否则将追究法律责任
共同学习,写下你的评论
评论加载中...
作者其他优质文章