大家都知道指针是C语言中的精髓,它能直接对物理地址进行访问,具有双重功能,是嵌入式设计中必不可少的一门语言。C语言功能强大的主要原因就是具有指针结构。指针是一种特殊的数据类型,直接指向目标的存储地址,实现直接访问对象存储空间的功能。公众号——“游戏开发教程”
很多初学者会产生这样的感觉:我可以用C语言学习其他知识,但我不理解指针。如果是这样,我可以很好地告诉你,你不是在学习编程语言。所以学习指针对于初学者来说是非常重要的。你可能认为它有点抽象,但是当你完全理解指针的含义时,你会发现指针非常方便使用。
1、指针指向变量:公众号——“游戏开发教程”
下面有这样一个代码块:
int main
{int a=10;int b=15;test(a,b);printf("a=%d,b=%d\n",a,b);}
voidtest(int x,int y)
{int tmp;tmp=x;x=y;y=tmp;}
最后输出的结果还是a=10,b=15。因为在函数调用时,实参和形参之间只是值传递。但我们使用指针结果就不一样了,如:
int main
{int a=10;int b=15;test(&a,&b);printf("a=%d,b=%d\n",a,b);return 0;}
voidtest(int * x,int *y)
{int tmp;tmp=*x;*x=*y;*y=tmp;}
输出结果a=15,b=10。变量a和b的值发生了交换。这是因为我们利用指针访问变量的存储单元,间接修改变量的值。
关于怎么快速学C/C++,有什么方法,这个问题,想必大家都已经心中有数了,打算深入了解这个行业的朋友,可以+下小编的C/C++学习qun:七六六+二五六+一零五,不管你是小白还是大牛,小编我都欢迎,不定期分享干货,每天晚上20:00我都会开直播给大家mianfei分享C/C++学习知识和路线方法,qun里会不定期更新最新的教程和学习方法,如果你是正在学习C/C++的小伙伴可以+入学习。,学习更多C/C++相关知识也可以去公众号——“游戏开发教程”
2、指针指向数组:公众号——“游戏开发教程”
定义一个数组并初始化,intarray[5]={2,5,12,7,8},定义一个指针变量并把数组的地址赋给它,int *p=array,注意数组名就是数组的地址,而且数组的地址就是首元素的地址。因此我们的指针变量就指向了数组的首元素,*p=2。如果把(p+1),那么指针变量就指向了数组的下一个元素5,因此我们可以利用指针来遍历数组的各个元素。数组名是一个指向数组中第一个元素的常量指针。
因此,在下面的声明中:
doublebalance[50];
balance是一个指向 &balance[0] 的指针,即数组 balance 的第一个元素的地址。因此,下面的程序片段把p赋值为balance的第一个元素的地址:
double *p;double balance[10];p = balance;
使用数组名作为常量指针是合法的,反之亦然。因此,*(balance + 4) 是一种访问 balance[4] 数据的合法方式。
一旦您把第一个元素的地址存储在 p 中,您就可以使用 *p、*(p+1)、*(p+2) 等来访问数组元素。下面的实例演示了上面讨论到的这些概念:
#include int main {
/* 带有 5 个元素的整型数组 */
double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0}; double *p; int i; p = balance;
/* 输出数组中每个元素的值 */
printf( "使用指针的数组值\n"); for ( i = 0; i < 5; i++ ) { printf("*(p + %d) : %f\n", i, *(p + i) ); }
printf( "使用 balance 作为地址的数组值\n"); for ( i = 0; i < 5; i++ ) { printf("*(balance + %d) : %f\n", i, *(balance + i) ); } return 0;}
当上面的代码被编译和执行时,它会产生下列结果:
使用指针的数组值*(p + 0) : 1000.000000
*(p + 1) : 2.000000
*(p + 2) : 3.400000
*(p + 3) : 17.000000
*(p + 4) : 50.000000
使用 balance 作为地址的数组值
*(balance + 0) : 1000.000000
*(balance + 1) : 2.000000
*(balance + 2) : 3.400000
*(balance + 3) : 17.000000
*(balance+ 4) : 50.000000
在上面的实例中,p 是一个指向 double 型的指针,这意味着它可以存储一个 double 类型的变量。一旦我们有了 p 中的地址,*p将给出存储在 p 中相应地址的值,正如上面实例中所演示的。
3、指针指向字符串:
我们都知道用数组存储字符串,如char name[20]="jack",上面已经简单讲述了指针指向数组,所以我们可以这样做,char *name="jack",指针变量指向字符串的首个字符并可以依次访问字符串的各个字符。
4,指针指向函数:公众号——“游戏开发教程”
我们需要知道怎样表示一个指针指向函数,说白了就是语法要正确,下面我也取一个代码块来说明一下:
int sum(int x,int y)
{return x+y;}
int main
{int a=5;int b=6;int (*p)(int,int);p=sum;int result=(*p)(a,b);printf("The result is %d\n",result);return 0;}
不难发现上面代码块里语句(*p)(a,b)可以用p(a,b)来代替,因为p和sum就是一样的,只是用前者可能更容易理解一点。而我们要知道怎样定义一个指针指向函数,int (*p)(int,int)这是固定写法,前面的int是指针将来指向的函数的返回值的类型,如果没有函数返回值,那就是void,后面括号里的两个int 当然就是指针将指向的函数的形参。指针指向函数用起来确实有点抽象,要想熟练运用的话就多去做一些这方面的练习吧
5,指针指向结构体:公众号——“游戏开发教程”
在C语言中几乎可以创建指向任何类型的指针,包括用户自定义的类型。创建结构体指针是极常见的。下面是一个例子:
typedefstruct {
char name[21];
char city[21];
char state[3]; } Rec;
typedefRec *RecPointer;
RecPointer r;
r=(RecPointer)malloc(sizeof(Rec));
综上所述,指针的基本用法就是这几种,还有些用法不常见的小编在此就一一例举了,有兴趣的话可以去翻阅相关的资料。
如果本文对你有帮助的话请多多转发关注哦!有什么问题咱们评论区见!公众号——“游戏开发教程”
网友评论