黑马程序员——C语言中的指针变量初步认识
2015-05-31 12:14
423 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
在认识指针之前,已经学过很多变量类型了,包括整形、字符型、浮点型等等,这些都还比较好理解。
不过C语言的精髓就在于指针啊!
今天就来说说自己对于传说中的”指针“理解。
什么是指针?
指针是在C语言中经常使用的一种变量类型。运用指针是一种主要的编程方法。指针可以”辅助“表示各种数据结构,除了简单的整形、字符型
还能很方便的操纵数组和字符串,像汇编语言一样处理内存地址,也就是老师们常说的,”更底层“的方法,从而编写出精炼而高效的程序。
提到指针,提到内存,就不得不先说说计算机系统的相关知识,“知其然知其所以然”嘛!
存储器又是什么?
在计算机中,所有的数据都是存放在存储器中的。一般把存储器的一个字节称为一个内存单元。
在老师的PPT中也形象的画过内存单元,一个”int“占用4个单元,一个"char"占1个单元。当然,在不同的系统中,略有不同,这
里就不多说了。
每一个变量被创建之后,就被内存保存起来,我们除了可以直接使用变量访问,还可以用更灵活的指针来访问对应的变量。
指针是如何访问的?
数据在内存中是有序的,就像是我们的门牌号一样,”张三“住在XX街XX号,数据也一样,在内存中有自己的地址。指针就是通
过地址来访问我们需要调用的数据的。
指针是怎么”指“的?
终于到了重头戏了!
指针本身是一个变量,它又如何”指“向另外一个变量呢?
通俗的讲,指针就像是一张小卡片,小卡片上记录着一个数据的内存地址。我们拿着这张”小卡片“就可以找到需要的东西。
这里很容易模糊的是,指针和所指的变量是两个完全不相同的数据类型。指针的值是地址,是我们赋给它的。这个地址上存的东
西,才是我们真正在寻找的东西。
用一句话来说,就是:”指针“是指地址,是常量,”指针变量“是指取值为地址的变量。
定义指针的目的是为了通过指针去访问内存的单元。
还是有点”绕“!
没关系,在代码中,可以更深入的理解。
<span style="font-family:Microsoft YaHei;font-size:18px;">int *p1;
char *p2;
float *p3;
</span>
这就是在代码中,创建一个指针的方法。
这里要注意,虽然”*“是与后面变量名放在一起,但事实上,它的意思是(int *)p1,p1是一个”指向int型数据“的指针。指针
的名字是p1。
下面这段代码,将指针与变量真正的联系起来。
<span style="font-family:Microsoft YaHei;font-size:18px;">int *p = &a;</span>
这段代码的意思是,名字是p的指针,指向一个int型的变量a。
”&“的意思是取a的地址。
所以p的”值“是”&a“,是一个表示内存中地址的数据。
指针怎么操纵变量?
#include<stdio.h>
int main(){
int a=6;
int *p = &a;
printf("%d",*p);
return 0;
}
这段代码打印的是并不是”a",而是打印的"*p“。
一个printf函数就看出了指针的”道道“:p的值是a的地址,*p的值就是a本身!
那么通过指针能间接的改变a的值吗?答案是可以,不然怎么叫操纵呢。
<span style="font-family:Microsoft YaHei;font-size:18px;">#include<stdio.h>
int main(){
int a=6;
int *p = &a;
*p = 5;
printf("%d",a);
return 0;
}</span>
这里我们直接给*p赋值5,最后p所指向的a也变成5了。
再来看一段稍微复杂一点的,比大小。
<span style="font-family:Microsoft YaHei;font-size:18px;">#include<stdio.h>
int main(){
int a = 0, b = 0, *p, *p1, *p2;
scanf("%d%d", &a, &b);
p1 = &a;
p2 = &b;
if (a < b){
p = p1;
p1 = p2;
p2 = p;
}
printf("a = %d, b = %d\n", a, b);
printf("max = %d, min = %d\n", *p1, *p2);
return 0;
}</span>
看出些什么不同吗?
指针之间也能相互赋值!他们之间交换的是什么呢?没错,是地址,之前提到过,指针的值是常量,也是可变的。
在交换之后,他们”指向“的变量也变化了。
其实指针跟之前所学的变量并没有什么本质上的不同,唯一不同就是额外的功能,可以间接的表示内存地址上的变量。
指针在函数中的应用
既然指针可以表示一个变量,那么可以应用到函数里吗?当然可以!指针也可以作为函数的参数!
<span style="font-family:Microsoft YaHei;font-size:18px;">#include<stdio.h>
int square(int n){
return n * n;
}
int main(){
int num = 2;
printf ("The original number is %d\n" , num);
printf ("The new value of number is %d\n" , square(num));
return 0;
}</span>
这里定义了一个square函数,也就是求平方的函数。
在没有使用指针之前,传给函数的参数是整形变量n,返回值也是一个整形,即n*n。
然后我们打印了num的值,也就是2。下一行打印num的平方的值,输出4。
下面用指针来做。
<span style="font-family:Microsoft YaHei;font-size:18px;">void square(int* n){
*n=*n**n;
}
int main(){
int num = 2;
printf ("The original number is %d\n" , num);
square(&num);
printf ("The new value of number is %d\n" , num);
return 0;
}</span>
跟上一个函数有什么不同呢?
返回值不同:
首先从第一行的square函数,就看到返回值不同。之前返回的是int,而这次是void也就是说并没有返回值。
传进来的参数不同:
第一次传的是整形,int n。而第二次呢,是 int* n,是一个指针!
在调用的时候,写法也有区别:
第一次squate(num),第二次是square(&num)。
搜索
复制
在认识指针之前,已经学过很多变量类型了,包括整形、字符型、浮点型等等,这些都还比较好理解。
不过C语言的精髓就在于指针啊!
今天就来说说自己对于传说中的”指针“理解。
什么是指针?
指针是在C语言中经常使用的一种变量类型。运用指针是一种主要的编程方法。指针可以”辅助“表示各种数据结构,除了简单的整形、字符型
还能很方便的操纵数组和字符串,像汇编语言一样处理内存地址,也就是老师们常说的,”更底层“的方法,从而编写出精炼而高效的程序。
提到指针,提到内存,就不得不先说说计算机系统的相关知识,“知其然知其所以然”嘛!
存储器又是什么?
在计算机中,所有的数据都是存放在存储器中的。一般把存储器的一个字节称为一个内存单元。
在老师的PPT中也形象的画过内存单元,一个”int“占用4个单元,一个"char"占1个单元。当然,在不同的系统中,略有不同,这
里就不多说了。
每一个变量被创建之后,就被内存保存起来,我们除了可以直接使用变量访问,还可以用更灵活的指针来访问对应的变量。
指针是如何访问的?
数据在内存中是有序的,就像是我们的门牌号一样,”张三“住在XX街XX号,数据也一样,在内存中有自己的地址。指针就是通
过地址来访问我们需要调用的数据的。
指针是怎么”指“的?
终于到了重头戏了!
指针本身是一个变量,它又如何”指“向另外一个变量呢?
通俗的讲,指针就像是一张小卡片,小卡片上记录着一个数据的内存地址。我们拿着这张”小卡片“就可以找到需要的东西。
这里很容易模糊的是,指针和所指的变量是两个完全不相同的数据类型。指针的值是地址,是我们赋给它的。这个地址上存的东
西,才是我们真正在寻找的东西。
用一句话来说,就是:”指针“是指地址,是常量,”指针变量“是指取值为地址的变量。
定义指针的目的是为了通过指针去访问内存的单元。
还是有点”绕“!
没关系,在代码中,可以更深入的理解。
<span style="font-family:Microsoft YaHei;font-size:18px;">int *p1;
char *p2;
float *p3;
</span>
这就是在代码中,创建一个指针的方法。
这里要注意,虽然”*“是与后面变量名放在一起,但事实上,它的意思是(int *)p1,p1是一个”指向int型数据“的指针。指针
的名字是p1。
下面这段代码,将指针与变量真正的联系起来。
<span style="font-family:Microsoft YaHei;font-size:18px;">int *p = &a;</span>
这段代码的意思是,名字是p的指针,指向一个int型的变量a。
”&“的意思是取a的地址。
所以p的”值“是”&a“,是一个表示内存中地址的数据。
指针怎么操纵变量?
#include<stdio.h>
int main(){
int a=6;
int *p = &a;
printf("%d",*p);
return 0;
}
这段代码打印的是并不是”a",而是打印的"*p“。
一个printf函数就看出了指针的”道道“:p的值是a的地址,*p的值就是a本身!
那么通过指针能间接的改变a的值吗?答案是可以,不然怎么叫操纵呢。
<span style="font-family:Microsoft YaHei;font-size:18px;">#include<stdio.h>
int main(){
int a=6;
int *p = &a;
*p = 5;
printf("%d",a);
return 0;
}</span>
这里我们直接给*p赋值5,最后p所指向的a也变成5了。
再来看一段稍微复杂一点的,比大小。
<span style="font-family:Microsoft YaHei;font-size:18px;">#include<stdio.h>
int main(){
int a = 0, b = 0, *p, *p1, *p2;
scanf("%d%d", &a, &b);
p1 = &a;
p2 = &b;
if (a < b){
p = p1;
p1 = p2;
p2 = p;
}
printf("a = %d, b = %d\n", a, b);
printf("max = %d, min = %d\n", *p1, *p2);
return 0;
}</span>
看出些什么不同吗?
指针之间也能相互赋值!他们之间交换的是什么呢?没错,是地址,之前提到过,指针的值是常量,也是可变的。
在交换之后,他们”指向“的变量也变化了。
其实指针跟之前所学的变量并没有什么本质上的不同,唯一不同就是额外的功能,可以间接的表示内存地址上的变量。
指针在函数中的应用
既然指针可以表示一个变量,那么可以应用到函数里吗?当然可以!指针也可以作为函数的参数!
<span style="font-family:Microsoft YaHei;font-size:18px;">#include<stdio.h>
int square(int n){
return n * n;
}
int main(){
int num = 2;
printf ("The original number is %d\n" , num);
printf ("The new value of number is %d\n" , square(num));
return 0;
}</span>
这里定义了一个square函数,也就是求平方的函数。
在没有使用指针之前,传给函数的参数是整形变量n,返回值也是一个整形,即n*n。
然后我们打印了num的值,也就是2。下一行打印num的平方的值,输出4。
下面用指针来做。
<span style="font-family:Microsoft YaHei;font-size:18px;">void square(int* n){
*n=*n**n;
}
int main(){
int num = 2;
printf ("The original number is %d\n" , num);
square(&num);
printf ("The new value of number is %d\n" , num);
return 0;
}</span>
跟上一个函数有什么不同呢?
返回值不同:
首先从第一行的square函数,就看到返回值不同。之前返回的是int,而这次是void也就是说并没有返回值。
传进来的参数不同:
第一次传的是整形,int n。而第二次呢,是 int* n,是一个指针!
在调用的时候,写法也有区别:
第一次squate(num),第二次是square(&num)。
搜索
复制
相关文章推荐
- C/C++连接MYSQL
- C++基础学习(03AM)
- C++11 新特性整理
- 对学弟学妹学习C++的建议
- c++ ANSI、UNICODE、UTF8互转
- C/C++符号优先级和左/右结合性
- C/C++符号优先级和左/右结合性
- 【C语言】整人小程序
- VS2010 C++ MFC框架学习笔记3 - 控件Tab顺序设置及模态对话框
- C++ TinyXml操作
- 给定两个整数,比较出其中大者
- c++基础学习(02PM)
- C语言的数组初始化
- C语言fopen用法
- C++ 的 RTTI
- 标准C++中的string类的用法总结
- 基于DirectX的半球形天空类的C++和C#实现
- C++——类实例化内存的分配和this指针的使用
- DLL的双向头文件
- 由一题讨论C语言中的“指针数组作main函数的形参”即 main(int argc,char *argv[])的使用