c语言中的指针
2015-07-08 00:44
323 查看
c语言中的指针
标签(空格分隔): c前言
指针是c语言的灵魂,基本学没学好c语言就看指针了,又因为指针很难,所以学习起来都是模模糊糊的。这一篇仔细学一下它。希望能比能再搞懂一点。直接引用和间接引用
在说啥是指针之前,先把这2个概念搞清楚。直接引用就是对一个变量自身的赋值和取值,自给自足,不麻烦别人。
char a; a = 12; //直接引用赋值 printf("%d", a) //直接引用取值
如图所示:
间接引用呢,比较作死,就是我想读取或者写入一个变量
a的值,我是通过变量
b来实现。
b里面存放的是
a的地址,通过操作
b来间接操作
a:
好,搞清楚了
b里面存放的是
a的地址了,的这一种方式,叫
间接引用,好,那开始说指针。
指针
指针定义
指针就是干着间接引用的活儿,你申明了一个指针变量,它存放的是其他变量的首地址。
首地址是指一个变量最开始的占用空间字节的位置地址。如果,一个字符类型char,它就占1个字节的内存,那么首地址就是它自身的地址。如果,一个字符串类型占用4个字节,那么首地址就是第1个字节的地址。
字符类型在16位编译环境下占1个字节,指针的存储:
字符串数组类型在16位下占3个字节,首地址就是第一个字节的地址。指针的存储:
如何定义一个指针变量呢?用
变量类型+
*+
指针名组合起来,对比于单纯的变量的申明,其实就多了一个
*号。
int *p; char *b;
上面就申明了2个指针变量,整型指针
p, 字符指针
b。
*是一个说明符,用来说明这个变量是个
指针变量,是不能省略的,但它不属于变量名的一部分。
由于指针里存放的是变量的地址,任何变量,不管它是啥类型,它都会拆分依次存放在内存中,首地址都是固定的一个长度,所以,指针占用相同的存储空间,与指向的变量的数据类型无关,只与编译器环境有关:
指针初始化赋值
指针定义好了之后,就要给它赋值,前面说了,指针存的是一个变量的首地址,那么,我们给指针赋值,就是把这个变量的首地址赋给它。也就是指针指向这个变量。取地址用
&符号表示。一个变量前加一个
&就表示,取出这个变量在内存中的地址。
char a = 10; char *p; p = &a; //将a的地址取出来赋给p
要注意的是:定义一个指针的类型要和它指向的那个变量的类型要一致。
可以定义指针和赋值一起:
char a = 10; char *p = &a; //一起
这样,指针
p就指向整型变量
a了,那么,
a的命运完全就由
p来掌控了,哈哈哈哈。
用图来表示,就是:
指针的取值
指针的取值,是指取出指针所指向地址的空间的值,用符号*来表示取出一个指针指向的变量的值。
char a = 10; char *p = &a; int value = *p; //value =10 *p 表示取出p指向的地址的值
注意:第三行的
*是最容易的搞混的。很容易与定义指针变量的那个
*搞混淆。这里的
*是一个指针运算符,
*p表示根据p这个地址访问对应的存储空间,也就是变a的存储空间的值,也就是取出10:
所以,我们也可以用这种方式,给指针所指的变量重新赋值:
char a = 10; char *p = &a; *p = 9; //将指针p值所指向的指针的访问空间值改成20。也就是a变成9了。
所以,是有个顺序的:
定义一个指针变量p: int *p
将这个指针p指向变量a: p = &a;
改变a的值: *p = 9;
三步取一不可。
用图表示就是:
值得注意的是 : 和初始化指针一样,指针存的是变量的首地址,
*p取的是也是首地址的存储空间的值,如果是字符形,由于只占1个字节,所以
*p取到的值就是这个变量的值。如果是字符串数组
char[] = "qwe",那么
*p取到的就是首地址的值,也就是第一个字节的地址对应的值,也就是取到的是字符串的第一个字符q。
下面讲字符串,数组和指针的关系会重点说。
指针的用途
说了这么久。指针到底有啥用途呢,由于指针指向一个元素的地址,所以,指针最大的用途就是改变这个变量的值,并且快速移动指针。举了例子,函数中形参和实参的例子,一半形参不管怎么变,一半来说,实参是不受影响的,下面是交换2个变量的值:
void swap(char v1, char v2) { printf("更换前:v1=%d, v2=%d\n", v1, v2); // 定义一个中间变量 char temp; // 交换v1和v2的值 temp = v1; v1 = v2; v2 = temp; printf("更换后:v1=%d, v2=%d\n", v1, v2); } int main() { char a = 10, b = 9; printf("更换前:a=%d, b=%d\n", a, b); swap(a, b); printf("更换后:a=%d, b=%d", a, b); return 0; }
运行如下:
你看,其实并没有交换。那么现在就可以指针,因为,指针指向地址:
void swap(char *v1, char *v2) { // 中间变量 char temp; // 取出v1指向的变量的值 temp = *v1; // 取出v2指向的变量的值,然后赋值给v1指向的变量 *v1 = *v2; // 赋值给v2指向的变量 *v2 = temp; } int main() { char a = 10, b = 9; printf("更换前:a=%d, b=%d\n", a, b); swap(&a, &b); printf("更换后:a=%d, b=%d", a, b); return 0; }
运行如下:
相关文章推荐
- C语言递归实现字符串翻转
- C++0x的高级目标
- C++0x将极有可能支持可选的垃圾收集机制
- 程序员都应该学习C语言
- C语言是个低级语言
- Ardunio_PWM 原理及实现
- eclipse for C/C++
- HDU 1548 A strange lift(bfs)
- c语言链表的创建、插入、删除、排序
- 【C/C++】文件读写
- C++template元编程学习心得-switch结构
- C++判断用户输入是否为数字?
- C++template元编程学习心得--数据类型
- 【C++ 基础】——引用
- Ubuntu 12.04 与Eclipse C++部署
- C++ cin系列与get系列 函数 实现 用例 浅析
- C++中操作符重载自增\自减
- C语言非递归实现字符串逆转
- c语言中的isalpha,isdigit,islower,isupper等一系列函数
- 标准C++读写文件