当我们学习C语言时,一般都会觉得指针这块是比较难理解的。而指针一般分为一级指针、二级指针、指针和数组、指针数组等。下面就是我对这几种的简单理解。指针实际就相当于地址,它是数据的唯一标识。
1.一级指针分为整形指针和字符指针
(1.)字符指针 ——类型为char * 型,就是指向字符(char)的指针。(相当于一个指针变量里存储的是字符的地址),如下面简单例子所示。
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> int main() { char ch = ‘w‘; char *p = &ch; //‘&‘为取地址操作符,即将ch的地址放在p中,此时p就是一个指针变量,它里面的内容就是ch的地址。 *p = ‘y‘; /* ‘*‘是解引用操作符,即将p中的内容解引用,而p中内容是ch的地址,解引用后即是ch地址里的内容是ch即为‘w’。 */ printf("%c\n", ch);//所以输出ch为‘y‘。 system("pause"); return 0; }
(2.)整形指针——类型为int *型 ,就是指向整型的指针,即指针变量里存放的是整型(int)的地址。如下面简单例子所示。
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> int main() { int a = 200; int *p = &a; //‘&‘为取地址操作符,即将a的地址放在p中,此时p就是一个指针变量,它里面的内容就是a的地址。 *p = 400; /* ‘*‘是解引用操作符,即将p中的内容解引用,而p中内容是a的地址,解引用后即是a地址里的内容就是a即200。*/ printf("%d\n", a);//所以输出a为400。 system("pause"); return 0; }
其实一级指针还是比较容易理解的,只需要记住指针变量里存的是某种类型数据的地址,它一般的类型为(某种类型) *(指针变量){其中某种类型就是指针变量中存放的地址所属的数据的类型}。
2.二级指针——顾名思义,一级指针是存某种数据的地址,而二级指针就是指向指针的指针,即其指针变量存放的是一个指针的地址。一级指针类型为(某种类型) *(指针变量){其中某种类型就是指针变量中存放的地址所属的数据的类型}。所以二级指针的一般类型为(某种类型) **(指针变量){其中某种类型就是指针变量中存放的地址所属的指针的的类型}。如下例所示。
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> int main() { int a = 200; int *p = &a;//指针变量p内存放的是整型a的地址 int **q = &p;//指针变量q内存放的是指针p的地址 printf("%d\n", *p);//一次解引用后便是a的值 printf("%d\n", **q); //第一次解引用后便是q的值是p的地址,而第二次解引用后是p的地址的值即整型a的值。 //所以两次输出的结果一样都是a的值即200 system("pause"); return 0; }
掌握一级指针和二级指针后,我们便会发现其实都是有规律的,所以也会发现多级指针也没有那么难理解了。比如一级指针是指向数据的指针,二级指针是指向一级指针的指针,那么三级指针便是指向二级指针的地址以此类推。只要记住,多级指针的指针变量内存的都地址。
3.指针数组
实际上指针数组就是数组,就像我们以前所学的数组是整形数组、字符数组那样,整形数组就是一个数组里存放的是整形数据,字符数组就是一个数组里存放的是字符数据没所以指针数组就是一个数组,里面存放的是一个一个的指针。但是它依旧是一个数组。如下所示
int *p[20];//整形指针的数组,数组里存放的全是整形指针(指向整形的) char *arr[20];//字符指针的数组,数组里存放的全是字符指针(指向字符的)
4.数组指针
这与上述的指针数组比较容易弄混,但是只要记住名字后面是什么,那么它实际就是什么,意思就是说指针数组后面两个字是数组,它实际是个数组,而数组指针后面两个字是指针,它实际就是个指针。它如同我们以前所学的整形指针、字符指针。整形指针是指向整形的指针,字符指针是指向字符的指针,那么数组指针就是指向数组的指针。
int (*p)[10];//表示一个数组指针
下面是一个简单的使用数组指针的例子:
#include <stdio.h> void print_arr(int (*arr)[5], int row, int col) { int i = 0, j = 0; for(i=0; i<row; i++) { for(j=0; j<col; j++) { printf("%d ",arr[i][j]); } printf("\n"); } } int main() { int arr[3][3] = {1,2,3,4,5,6,7,8,9}; print_arr(arr , 3 , 3); return 0; }
原文:https://www.cnblogs.com/sheena/p/10824313.html