指针的应用
Posted lemongirl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针的应用相关的知识,希望对你有一定的参考价值。
一.数组与指针
1.指针数组(存放指针的数组)
例如:char *p[10]; float *p[10];int * q[4][3];
? 一个数组,及其元素均为指针类型的数据——指针数组
一维指针数组:类型名 数组名[数组长度];
二维指针数组:类型名 数组名[行][列];
? 一维数值指针数组:
int array[8] = {1,2,3,4,5,6,7,8};
int *p[6] = {&array[0],&array[1],&array[2],&array[3]};
p[4] = &array[4];
p[5] = &array[5];
? 二维数值指针数组:
int *a[2][3];
a[0][1] = &array[0];
? 指针数组与字符串的联系:
char *name[2] = {"hello","world"};
name[0] = "hello";
name[1] = "world";
数组中存放的是字符串的首地址,而不是字符串。
//指针数组 #include <stdio.h> int main(int argc,char *argv[]) { char *name[] = {"Follow me","BASIC","Grate Wall"}; int i; for(i = 0;i < 3;i++) { printf("%s",name[i]); } return 0; }
2.数组元素指针(指向数组元素的指针)
? 数组元素在内存中分配的地址——数组元素的指针
? 定义一个指向数组元素的指针
int a_1[10];
int a_2[5][5];
int *p,*q;
p = &a_1[0]; //一维数组元素的指针
q = &a_2[1][1]; //二维数组元素的指针
? 在C语言中,设定一维数组名代表了数组第一个元素的地址。
int array[5];
int *p;
p = array[0]; 等价于 p = array;
? 引用数组元素
1.下标法:array[1];
2.指针法:*(p + i);或*(array+i);
? array为数组的首地址是一个常量,不能进行array++或++array操作。
? p是变量,其值为array数组的首地址,可以进行++操作。
//采用指针法引用数组元素 #include <stdio.h> int main(int argc,char *argv[]) { int a[5],i,*pa,*pb; pa = a; //数组名代表数组首地址 pb = &a[0]; //数组的第一个元素的地址也代表数组首地址 for(i = 0;i < 5;i++) { a[i] = i; printf("a[%d] = %d\n",i,a[i]); //0 1 2 3 4 printf("a[%d] = %d\n",i,*(a+i)); //0 1 2 3 4 printf("a[%d] = %d\n",i,*(pa+i)); //0 1 2 3 4 printf("a[%d] = %d\n",i,*pb++); //0 1 2 3 4 } //printf("a[%d] = %d\n",i,a++); //a为常量,不能进行++操作 return 0; }
3.数组指针(行指针)(指向数组的指针)
? 数组元素在内存中的起始地址——数组元素的指针
? 定义一个数组元素的指针
int a[10] = {1,2,3,4};
int *p = a; //p为数组元素的指针
? 数组在内存中的起始地址称为数组的指针
int a[10] = {1,2,3,4};
int (*q)[10] = &a; //q为指向数组的指针
a为一维数组名,代表数组第一个元素的指针。
&a:对a取地址,代表将整个数组当做一个整体,将这个地址付给q——数组指针。
//数组指针 #include <stdio.h> int main(int argc,char *argv[]) { int a[5] = {1,2,3,4,5}; int (*p)[5] = &a; //定义一个一维数组,指向一个一维数组 printf("%d\n",*((int *)(p+1)-1)); //5,p+1移动整个数组的长度 return 0; }
? 指向二维数组的数组指针
int a[3][4] = {{1,3,2,4},{5,6,7,34},{5,9,6,8}};
int (*p)[4] = a;
p等价于指向二维数组第0行,可完全替代a的作用。
? 二维数组名
? 二维数组名是一个二级指针
? a代表了二维数组第0行的行地址
? a+1代表了第一行的行地址
? *(a+1)代表了第1行第0列元素的地址
? *(a+1)+2代表了第1行第2列元素的地址
? *(*(a+1)+2)代表了第1行第2列元素
? 多维数组与指针
表示形式 | 含义 |
a | 数组名,指向一维数组a[0],即0行首地址 |
a+1、&a[1] | 1行首地址 |
*(a+0)、*a、a[0] | 0行0列元素地址 |
*(a+1)、(*(a+1)+0)、a[1] | 1行0列元素a[1][0]的地址 |
*(a+1)+2、a[1]+2、&a[1][2] | 1行2列元素a[1][2]的地址 |
*(a[1]+2)、*(*(a+1)+2)、a[1][2] | 1行2列元素a[1][2]的值 |
//数组指针 #include <stdio.h> int main(int argc,char *argv[]) { int a[3][5]={ {1,2,3,4,5}, {6,7,8,9}, {14,12,23,66} }; int i,j; int (*p)[5] = a; //定义一个数组指针指向一个二维数组 for(i = 0;i < 5;i++) //采用数组指针打印二维数组的第一行 printf("%d\n",*(p[0]+i)); for(i = 0;i < 5;i++) //采用数组指针打印二维数组的第二行 printf("%d\n",*(p[1]+i)); for(i = 0;i < 3;i++) //采用数组指针打印二维数组的全部内容 { for(j=0;j<5;j++) { printf("%d\t",*(p[i]+j)); if(j == 4) printf("\n"); } } return 0; }
二.函数与指针
1.指针作函数参数
2.指针作函数返回值
3.指向函数的指针
以上是关于指针的应用的主要内容,如果未能解决你的问题,请参考以下文章