欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C学习笔记(4)--- 指针的应用(第一部分)

程序员文章站 2023-10-28 23:12:40
1.指针(pointer)概念: 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:type *var-name; 在这里,type 是指针的基类型,它必须是一个有效的 C 数据类型, ......

1.指针(pointer)概念:

 

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:type *var-name;

在这里,type 是指针的基类型,它必须是一个有效的 c 数据类型,var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。

 

2.指针的应用:

a. 使用指针时会频繁进行以下几个操作:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。例子:

 

 

b. 在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 null 值是一个良好的编程习惯。赋为 null 值的指针被称为指针。

 

null 指针是一个定义在标准库中的值为零的常量。 例子: int  *ptr = null;   sub :在大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是操作系统保留的。然而,内存地址 0 有特别重要的意义,它表明该指针不指向一个可访问的内存位置。但按照惯例,如果指针包含空值(零值),则假定它不指向任何东西。

 

3. 深入谈指针的运动:

 

a.指针的算术运算:

c 指针是一个用数值表示的地址。因此,您可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-。

假设 ptr 是一个指向地址 1000 的整型(int)指针,是一个 32 位的整数,让我们对该指针执行下列的算术运算: ptr++; 

ptr将指向1004的地址。相同,如果ptr是个字符(char)的指针,其将指向1001地址。  因为int的长度是4字节,而char是1字节。

 

b.指针数组(pointer array):

假如我们让数组存储指向 int 或 char 或其他数据类型的指针。 例如:int *ptr[max]; 

在这里,把 ptr 声明为一个数组,由 max 个整数指针组成。因此,ptr 中的每个元素,都是一个指向 int 值的指针。下面的实例用到了三个整数,它们将存储在一个指针数组中。

 

sub:  指针数组(pointer array) 和 数组指针(array pointer)的区别!

指针数组:表示的是一个由指针变量组成的数组,也就是说其中的元素都是指针变量。

数组指针:表示的是这是个指向数组的指针,那么该指针变量存储的地址就必须是数组的首地址,得是个指向行的地址,如 a[2][3] 数组中的 a,a+1 等,不能是具体的指向列的地址,如 &a[0][1], &a[1][1] 这类地址。

 

 

c.指向指针的指针:

 

定义:指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。

int **var;             

 

d.传递指针给函数:

 

 

c 语言允许您传递指针给函数,只需要简单地声明函数参数为指针类型即可。

 

下面的实例中,我们传递一个无符号的 long 型指针给函数,并在函数内改变这个值:

 

(通过这种操作,你可以通过改变某个内存地址上的变量的数值来改变其数量。)

 

e.从函数返回指针:

 

int * myfunction(){

。。。

。。。

。。。

}

 

 

另外,c 语言不支持在调用函数时返回局部变量的地址,除非定义局部变量为 static 变量。

 

引用: