(C语言)精髓——指针
(1)作用:正确而灵活的运用指针,能够有效的表示复杂的数据结构,能动态分配内存,方便地使用字符串,有效而方便地使用数组,可以直接处理内存单元地址。
(2)概念:①变量的指针:变量(3)的地址。(2000)
②指针变量:存放变量地址的(即指针)的变量。(i_pointer)
如图所示:
(3)为了表示指针变量与它所指变量之间关系,在程序中就出现了用户“*”符号表示指向的对象。(*i_pointer-->i,*i_pionter与i所表示的意思是相同的)
注意:变量的类型与指针变量的类型必须相同。(int i与int i_pointer都是int型)
(4)指针的移动:“指针+1”所移动的字节由指针的类型决定。(int i_pointer,移动字节为4个字节)
(5)指针变量引用:①&:取地址运算符。(取地址)
②*:指针运算符,取指针所指向对象的内容。(取内容)
(6)“&”与“*”为同优先级运算符,按从右到左的顺序①&*pointer的含义:意思是先运算*i_pointer-->i,再执行一个&运算,可得到&*i_pointer-->&i。
②*&a的含义是:&a-->i_pointer, *&a-->*i_pointer, *i_pointer-->a, *&a-->a。
练习题:
编写一个函数实现两个数的交换:
#include<stdio.h> int main() { void swap(int x,int y); ,b=; swap(a,b); printf("%d %d\n",a,b); } void swap(int x,int y) { int t; t=x; x=y; y=t; }
结果如图所示:
原因分析:函数中的交换仅仅是X,Y中数值的交换,而没有改变a,b中的数值。原理如图所示:
正确代码如下:
#include<stdio.h> int main() { void swap(int x,int y); ,b=; swap(a,b); } void swap(int x,int y) { int t; t=x; x=y; y=t; printf("%d %d\n",x,y);}
分析原因:改变的仅仅是X,Y中的内容,而没有改变a,b中的内容。
正确运用指针,交换a,b中内容方式如下:
#include<stdio.h> int main() { void swap(int *x,int *y); ,b=; int *x,*y; x=&a,y=&b; swap(&a,&b); printf("%d %d\n",a,b); printf("%d %d\n",*x,*y); } void swap(int *x,int *y) { int t; t=*x; *x=*y; *y=t; }
#include<stdio.h> int main() { void swap(int *x,int *y); ,b=; int *x,*y; x=&a,y=&b; swap(&a,&b); printf("%d %d\n",a,b); printf("%d %d\n",*x,*y); } void swap(int *x,int *y) { int *t;/*定义一个指针变量*/ t=x;/*交换的仅仅是x,y中的地址*/ x=y; y=t; printf("%d %d\n",x,y);/*输出的是X,Y的地址*/ }
分析错误原因:地址交换,交换的仅仅是x,y中的地址。而a,b中的内容没有改变。
错误例子:
#include<stdio.h> int main() { void swap(int *x,int *y); ,b=; int *x,*y; x=&a,y=&b; swap(&a,&b); printf("%d %d\n",a,b); printf("%d %d\n",*x,*y); } void swap(int *x,int *y) { int *t; /* *t没有指向对象 */ *t=*x; *x=*y; *y=*t; }
分析错误原因:*t没有指向对象,因此*t地址会随机选择,会出现危险动作。
结果如图所示:
(C语言)精髓——指针的更多相关文章
- 浅谈c语言的指针
对于非计算机专业的同学,c语言的指针往往就是老师的一句“指针不考“就带过了.c语言的指针号称是c语言的灵魂,是c语言中最精妙的部分. 指针本质上也是变量,也就是一段内存,只是他的特殊之处是他存储的数据 ...
- C#委托与C语言函数指针及函数指针数组
C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...
- C语言二重指针与malloc
(内容主要源于网上,只是加入了些自己的剖析) 假设有一个二重指针: char **p; 同时有一个指针数组 char *name[4]; 如何引用p呢? 首先我们有程序代码如下 #include &l ...
- C语言函数指针基础
本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C ...
- 试读《JavaScript语言精髓与编程实践》
有幸看到iteye的活动,有幸读到<JavaScript语言精髓与编程实践_第2版>的试读版本,希望更有幸能完整的读到此书. 说来读这本书的冲动,来得很诡异,写一篇读后感,赢一本书,其实奖 ...
- 为什么C/C++语言使用指针
这是参加面试时,面试官问的一道开放性题目. 问题是:为什么C/C++语言使用指针? 这个问题一问出来,直接被面试官秒杀了,面试官大神,你怎么不按套路出牌啊? 说好的malloc和new的区别呢?说好的 ...
- C语言的指针变量
C语言的指针变量 在C语言中,变量是固定范围的存储空间,它存储的是赋给他的值, 比如: ; /* 这里是定义一个整型变量a,并把12这个值存储在a的地址空间上 这个地址空间是系统随机分配的,对用户是透 ...
- 《JavaScript语言精髓与编程实践》读书笔记
JavaScript语言精髓与编程实践读书笔记 function v1(v1){ v1 = 100; alert('v1:'+v1); } function v2(name){ v1.apply(th ...
- Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...
随机推荐
- MySQL学习笔记——安装及配置环境
1.安装的版本为mysql-5.6.24-win32.1432006610压缩版 查看教程http://jingyan.baidu.com/article/f3ad7d0ffc061a09c3345b ...
- QT 初阶 1.3 节 控件的几何排列
#include "mainwindow.h" #include <QApplication> #include <QHBoxLayout> #includ ...
- BloomFilter 与 Cuckoo Filter
BloomFilter 与 CuckooFilter Bloom Filter 原理 Bloom Filter是一种空间效率很高的随机数据结构,它的原理是,当一个元素被加入集合时,通过K个相互独立的H ...
- 再谈Jquery Ajax方法传递到action 【转载】
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://cnn237111.blog.51cto.com/2359144/984466 之 ...
- JavaScript parseInt函数
首先还是从很热门的实例parseInt("09")==0说起. parseInt(number,type)这个函数后面如果不跟第2个参数来表示进制的话,默认是10进制. 比如说pa ...
- Orchard源码分析(7):ASP.NET MVC相关
概述 Orchard归根结底是一个ASP.NET MVC(以后都简称为MVC)应用,但在前面的分析中,与MVC相关内容的涉及得很少.MVC提供了非常多的扩展点,本文主要关注Orchard所做的扩展.主 ...
- mysql 简单练习
1.查找全部学生的信息 [SQL]select * from student 受影响的行: 0 时间: 0.000s 2.查出成绩及格的所有人 [SQL]select * from student w ...
- 如何让图片在垂直方向与 div的底部对齐 水平居中
需要图片的绝对定位postion: absolute. 一般定位时, 是用div去定位. 一般不直接用 非div去"绝对/相对"定位. 如不直接用 等去定位. 因为这些好像不好定位 ...
- C语言内存管理(转)
伟大的Bill Gates 曾经失言: 640K ought to be enough for everybody — Bill Gates 1981 程序员们经常编写内存管理程序,往往提心吊胆.如果 ...
- 避免重定向301&302 (Avoid Redirects)
这个也是Best Practices for Speeding Up Your Web Site的第12条原则: 重定向的意思是,用户的原始请求(例如请求A)被重定向到其他的请求(例如请求B).这是H ...