C语言学习笔记之指针

1.指针

,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作

2.基本问题

在计算机中, 所有的数据都是存放在存储器中的, 不同的数据类型占有的内存空间的大小各不相同。内存是以字节为单位的连续编址空间, 每一个字节单元对应着一个唯一的编号, 这个编号被称为内存单元的地址。比如: int类型占/4个字节, char类型占1个字节等。内存为变量分配存储空间的首个字节单元的地址, 称之为该变量的地址。地址用来标识每一个存储单元, 方便用户对存储单元中的数据进行正确的访问。在高级语言中地址形象地称为指针。

地址与指针

指针相对于一个内存单元来说,指的是单元的地址,该单元的内容里面存放的是数据。在C语言中,允许用指针变量来存放指针,因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。
指针变量是存放一个变量地址的变量,不同于其他类型变量,它是专门用来存放内存地址的,也称为地址变量。定义指针变量的一般形式为**:类型说明符*变量名。
类型说明符表示指针变量所指向变量的数据类型;表示这是一个指针变量;变量名表示定义的指针变量名,其值是一个地址,**例如:charp1;表示p1是一个指针变量,它的值是某个字符变量的地址**

注意不允许把一个数赋予指针变量

不允许把一个数赋予指针变量,故下面的赋值是错误的。例如:
错误操作
C语言学习笔记之指针
分析:前面例子中定义了一个指针变量pointer,但是不能直接把200赋值给指针变量pointer。后面的例子中定义了一个整型变量a,并赋初始值为200,又定义了一个指针变量pointer,这个变量指向整型数据,pointer中只能用来存放整型变量的地址,而不能直接把整型变量a赋值给这个指针变量pointer。所以可以把a的地址赋值给pointer;应改成
C语言学习笔记之指针

改变形参不代表改变实参

不能企图通过改变指针形参的值而使指针实参的值改变。例如下面是错误的
分析:程序运行时,从main函数开始执行,通过scanf函数给a和b赋值,输入8和10,将a的地址和b的地址分别赋值给指针变量ap1和ap2,使指针ap1指向a,ap2指向b。接着执行if语句,由于a<b,调用conter函数,将a和b的地址传递给x和y。继续执行conter函数的函数体,交换x和y的地址,使形参x的值为&b,y的值为&a,但是无法使ap1指向变量b的地址,ap2指向变量a的地址。故不能实现交换
C语言学习笔记之指针
C语言学习笔记之指针

字符串指针

字符串指针指向的是一个字符串,例如下面是错误的
分析:string1是一个指针变量,指向字符串"I love China!",指针变量string1存放的是这个字符串的首地址。所以输出的是一个字符串,应改写成printf(“%s\n”,string1)
C语言学习笔记之指针

调用函数指针

函数指针变量的调用,以下是错误的
C语言学习笔记之指针
分析函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。函数调用中“(指针变量名)”的两边的括号不可少,其中的“”不应该理解为求值运算,在此处只是一种表示符号。要把“z=*pomax(x,y);”改成“z=(*pomax)(x,y);”