目录
1.什么是指针?
2.指针的作用(为什么要使用指针)
3.指针变量的定义和引用
4. 传指针 解引用
5.指针的运算
6.指针与数组的关系
7.补充内容(数据存放)
一.什么是指针
C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。通过地址能找到所需的变量单元,即地址指向该变量单元。将地址形象地化为“指针”,意思是通过它能找到以它为地址的内存单元。指针的大小只与平台有关,与指针类型无关。(x86系统4字节,x64系统8字节)
二.指针的作用(为什么使用指针)
指针的作用是:通过指针不仅可以对数据本身,还可以对存储数据的变量地址进行操作。指针就是内存地址,指针变量是用来存放内存地址的变量。
(1)提高程序的编译效率和执行速度。
(2)通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯。
(3)可以实现动态的存储分配。
(4)便于表示各种数据结构,编写高质量的程序。
(5)指针能够动态分配内存,直接操作内存地址。
(6)指针运行效率高。
(7)能有效地表示复杂的数据结构,比如:结构体。
(8)能方便而有效地使用数组。
三.指针变量的定义和引用
1.定义指针变量:
定义指针变量的一般形式为:类型名 *指针变量名;
如:int*p
可以在定义指针变量的同时对它进行初始化,如:int*p=&a;(定义指针变量p,并指向a)
注意:
(1)指针变量前的“*”表示该变量为指针型变量。指针变量名是p不是*p。
(2)在定义指针变量时必须指定基类型。一个变量的指针的含义包括两个方面,一是以存储单元为编号表示的纯地址,一是它指向的存储单元的数据类型(如int,char,float等)。
(3)如何表示指针类型。指向整形数据的指针类型表示为“int*”,读作“指向int的指针”或简称“int指针”。
(4)指针变量中只能存放地址(指针),不要将一个整数赋给一个指针变量。
2.引用指针变量:
(1)给指针变量赋值。 p=&a; //把a的地址赋给指针变量p
(2)引用指针变量指向的变量。
如果已执行“p=&a;”,即指针变量p指向了整形变量a.则printf("%d",*p);其作用是以整形输出指针变量的值。如果有*p=1;表示将整数1赋给p当前所指向的变量,如果p指向变量a,则相当于把1赋给a,即“a=1;”。
(3)引用指针变量的值。如:printf("%o",p);
作用是以八进制数形式输出指针变量p的值,如果p指向了a,就是输出了a的地址,即&a。
四。传指针 解引用
传指针,解引用,是一个函数的改变要影响另一个函数需要的连个条件。
形参的改变影响实参。
例:swap函数交换a,b数值
#include<stdio.h>
void swap(int*a,int*b) {
int temp=*a;
*a = *b;
*b = temp;
}
int main() {
int a = 10;
int b = 20;
int* p = &a;
int* q = &b;
swap(p,q );
printf("%d %d", a, b);
}
五.指针的运算
1.指针的变量赋值运算:将变量的地址赋给指针变量
2.指针的自增,自减
自增(减):将指针变量指向下(上)一个元素的运算。当计算机执行自增(减)运算后,指针变量实际增加(减少)为指针变量类型的字节数。即:<指针变量>=<指针变量>+(-)sizeof(<指针变量类型>)。(自增,自减运算符即可前置也可后置)
3.加减n
指令格式:<指针变量>=<指针变量>+(-)n;是将指针变量指向下(上)n个元素的运算。当计算机执行加减n指令之后,指针变量实际增加值(减少值)为指针变量类型字节数乘以n。即:<指针变量>=<指针变量>+(-)sizeof(<指针变量类型>)*n.
补充:*的用法
乘法 | 数据*数据 | int a=2; a=a*a; |
指针定义 | 类型*变量名 | int*p=&a; |
解引用 | *指针类型的变量名 | *p=10; |
六.指针与数组的关系
对指针进行自增操作会让指针指向与当前元素相邻的下一个元素,即 *(p + 1) 将指向 a[1] ;同样的, *(p + i) 将指向 a[i] 。因此,数组下标与指针运算之间的关系是一一对应的。根据定义,数组类型的变量或表达式的值是该数组第 1 个元素的地址,且数组名所代表的的就是该数组第 1 个元素的地址所以p=&a;等价于p=a;一个通过数组和下标实现的表达式可以等价地通过指针及其偏移量来实现。
七.补充内容(数据存放)
(1)栈内存划分从高地址指向低地址
(2)数据存储从低地址指向高地址
小端模式:低位数据 存放 低地址位置
Windows数据存放 按照小端模式进行数据存储。