C语言指针学习总结

作者:driveby

来源:https://www.cnblogs.com/KKSJS/p/9622812.html

上学的时候学习C语言,最烦的就是里面指针,可是指针也恰恰是C语言的灵魂。

最近在重温数据结构的内容,因为大多数据结构的教材都是用C语言描述的,而数据结构中也大量的用到了指针的内容,所以我就在这篇笔记中记录一下我这周复习C语言的心得。

先看看百科上对指针的描述。

在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在计算机存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

作个比喻,假设将计算机存储器当成一本书,一张内容记录了某个页码加上行号的便利贴,可以被当成是一个指向特定页面的指针;根据便利粘贴面的页码与行号,翻到那个页面,把那个页面的那一行文字读出来,这就是指针的作用。

下面将通过一些代码说明指针在C语言中的表现形式。

int main(){
int a ;
a = 10;
int *p;
p = &a;
}

如果用图片描述这段代码,就是下面这个样子。

怎么来理解呢?首先这段代码里通过int aint *p定义了两个变量:分别是p和a,p变量与a变量的定义方式有一些不同,a变量就是C语言中一个很普通的int型变量,通过a=10 将10这个整型赋值给了a。

而p变量的定义前面有一个  * ,这个 * 表明了p变量是一个指针变量,指针变量里面只能存放地址,这个地址是内存中的某个位置,在上面的代码中我们在p变量里面存放的是0x2C406B24这个地址,这个地址里面存放的值必须是int值,在我们这里,p变量里面存放的地址是a变量的地址,a变量在定义时就是一个int,所以是符合要求的。

这样一来,我们就说p变量指向了a变量,p = &a 这句代码完成了p指向a的这个操作。这里没有写p = a,那是因为p变量需要的是一个地址,而不是a变量里面存放的值,所以&这个操作符就是取地址的意思,通过&a取到a变量在内存中的地址,将地址赋值给p指针变量,就使p指向了a。

既然p是一个指针变量,那它就可以赋值给另外一个指针变量,如下:

int main(){    int a ;    a = 10;    int *p;    p = &a;    int *q;    q = p;}

新定义了一个指针变量q,将p变量里的值0x2C406B24这个地址,赋值给q,这样q变量与p变量里都保存了同样的地址,就是说他们都指向同一个值。

int main(){
int a ;
a = 10;
int *p;
p = &a;
int *q;
q = p;
*p = 5; //
*q = 0; //
}

介绍完指针,那这个东西有什么作用呢?如果要修改a变量里面的值,可以执行a=5,这是没介绍指针之前的做法。学习完指针后,通过指针也能达到修改a变量里的值的目的*p=5

这是很有用的,举个例子,我们来看下面这段代码。

void swap(int a,int b);int main(){    int a = 5;    int b = 6;    swap(a, b);    printf('a=%d b=%d',a,b);    return 0;}void swap(int a, int b){    int temp;    temp = a;    a = b;    b = temp;}

上面这段代码,这段代码能够达到交换a和b的值的目的吗?答案是不能,因为C语言在调用函数时,永远只能时传值给函数

在C语言中每个函数都有自己的变量空间,函数的参数也位于这个独立的空间中,与其它函数没有关系,上面的代码中有两个函数,一个是main函数,另一个是swap函数,所以这两个函数里的a,b变量是不同空间中的变量,他们之间毫无关系可言。

所以对swap函数中的a,b做交换,完全不能改变main函数中a,b变量的值。

函数在每次运行的时候,会产生一个独立的变量空间,在这个空间中的变量,是函数这次调用时所独有的,称为本地变量

定义在函数内部的变量就是本地变量,参数也是本地变量。

变量有 生存期作用域 这两个属性。

  • 生存期:什么时候变量开始出现,到这个变量消亡

  • 作用域:在代码的什么范围内可以访问这个变量(这个变量可以起作用)

对于本地变量而言,生存期与作用域都是在本地变量所在的大括号(块)内。

既然都说到本地变量了,那就总结一下本地变量的一些规则。

本地变量的规则:

  • 本地变量定义在块内

  • 本地变量只存在于运行块内语句的期间

  • 在块外面定义的变量,块里仍然有效

  • 本地变量不会默认初始化

  • 参数这样的本地变量在进入函数时就被初始化了

  • 列表内容

又说回上面的交换函数,那么怎样才能达到交换main函数里a,b两个变量值的目的呢?

void swap(int a,int b);
int main(){
int a = 5;
int b = 6;
swap(&a, &b);
printf('a=%d b=%d',a,b);
return 0;
}
void swap(int *pa, int *pb){
int temp;
temp = *pa;
*pa = *pb;
*pb = temp;
}

利用上面所学习的指针,改写成上面这样,才能达到交换的目的。

始终记住:C语言在调用函数时,永远只能时传值给函数。在上面的代码中,自然也是传值进的swap函数,只不过在使用指针时,这个值指的是地址,地址当然也是一个值。

将main函数中a和b变量的地址传给了swap函数中的指针变量pa和pb,在swap函数中通过 *pa 和 *pb 操作到了main函数中的a和b,从而达到了交换的目的。

这只是指针的作用之一,用好了指针,才能体现出C语言更多强大的地方。


数组

这是一篇总结指针的文章,那么我为什么要提到数组呢?

因为数组和指针又太多的相似之处。看下面一段代码。

int test(int a[], int numOfa){    int i;    for(i = 0; i<numOfa; i  ){        printf('%d',a[i])    }}

其实数组中的[ ],与 * ,. ,& 等运算符一样,也是一种运算符。

上面test函数里的a数组变量,本身就是一个地址,所以我们在调用这个函数的时候,需要写成这样test( &a, i) ,需要传入一个地址,这个地址所在的变量保存的就是一个数组。

例如:

  • int a[10]; int *p = a;  // 不需要用&取地址,数组变量本身就表达地址

  • a == &a[0] 但是数组的单元表示的是变量,需要用&对变量取地址。数组变量第一个单元的地址就是数组变量的地址。

  • p[0] == a[0]   [ ] 运算符可以对数组做,也可以对指针做

  • *a = 9 将数组的第一个单元赋值为9,说明 * 运算符既可以对数组做,也可以对指针做

最后在总结一下const关键字在指针中的规则:

  • const int *p = &i  :const在前,表示不能通过指针去修改变量

  • int * const p = &i :const在后,表示p这个指针变量不能再保存别的地址值

(0)

相关推荐

  • 【原创】C++指针详解

    指针 一,基础知识 1,内存(memory) 电脑是在CPU里面执行任务的,CPU就相当于人的大脑.CPU计算速度很快,所以我们写程序时,哪怕例如执行100多次循环,看起来似乎都是一秒就能执行好的.然 ...

  • C语言学习篇(15)-----函数传参详解

    https://m.toutiao.com/is/JpuAcLb/ 前面我们已经介绍过什么是指针,指针变量的用法等等,今天我们就来讲讲什么是函数,函数有啥作用,函数的参数有哪些需要注意的地方以及指针与 ...

  • 哔哩哔哩(B站)语言类学习视频大汇总!

    哔哩哔哩(B站)语言类学习视频大汇总! 长图 长图 长图 长图 长图 长图

  • 英语语言的学习环境的重要性

    英语学习环境这里讨论的英语学习环境是指国内中学生学习英语的环境. 1.社会环境 国内英语语言环境是汉语语言环境,除了课堂和个别兴趣班,几乎没有英语学习的社会环境. 2.英语课堂环境现状 (1)追求升学 ...

  • C语言指针用得好犹如神助!这些使用技巧值得收藏!

    指针用的好犹如神助,用不好会让你叫苦连连,但大多数人是用不好指针的,所以后来的很多语言都把指针封装,屏蔽. 比如JAVA:java是没有指针的,但是很多地方都用到指针,不过不对用户开放,语言的自身机制 ...

  • R语言深度学习不同模型对比分析案例

    原文链接:http://tecdat.cn/?p=5147 介绍 深度学习是机器学习最近的一个趋势,模拟高度非线性的数据.在过去的几年中,深度学习在各种应用中获得了巨大的发展势头(Wikipedia ...

  • 语言领域学习心得

    看了语言领域的第一点听与说的教育建议,我自认为能较好地做到这些.如多给幼儿提供倾听和交谈的机会.我经常和孩子们一起谈论他们感兴趣的话题,坚持给他们讲故事,一起看图书.并且我也注意培养他们的倾听习惯.以 ...

  • R语言入门学习路径+资源集(生信篇)

    学习始终是自己的事情,好的资源可以大大缩短路程,如果你还没有入门R语言,又或者你已经入门了R但不知道如何进阶,不妨收藏这篇. 强烈推荐: 这是DataCamp 的联合创始人 Martijn Theuw ...

  • 吴勇毅 | 我们不再是为习得语言而学习语言:更广阔的视角

    本文转自于:国际汉语教学研究 我们不再是为习得语言而学习语言:更广阔的视角 吴勇毅 华东师范大学国际汉语文化学院/应用语言研究所 一.引言 国际文凭课程(International Baccalaur ...

  • 【教育】524名外国人在塔吉克斯坦语言学院学习!

    2021年7月20日,(杜尚别,夏冉译)据"阿维斯塔"的消息称,今天,在新闻发布会上,塔吉克斯坦语言学院校长古利拉扎尔佐达告诉媒体,有524 名外国人在该学院学习.其中,乌兹别克斯 ...

  • R语言深度学习:用keras神经网络回归模型预测时间序列数据

    原文链接:http://tecdat.cn/?p=23250 回归数据可以用Keras深度学习API轻松拟合.在本教程中,我们将简要地学习如何通过使用R中的Keras神经网络模型来拟合和预测回归数据. ...