数组指针与指针数组 数组指针:谁在后面就是定义为谁,即数组指针为指针 指针数组:先是数组; 在C语言中,我们将第 0 个素的地址称为数组的首地址 arr 本身就是一个指针,可以直接赋值给指针变量 p。arr 是数组第 0 个素的地址,所以也可以写作。也就是说,arr、p、&arr[0] 这三种写法都是等价的,它们都指向数组第 0 个素,或者说指向数组的开头. 如果一个指针指向了数组,我们就称它为数组指针(Array Pointer)。 引入数组指针后,我们就有两种方案来访问数组素了,一种是使用下标,另外一种是使用指针。 1) 使用下标 也就是采用 arr[i] 的形式访问数组素。如果 p 是指向数组 arr 的指针,那么也可以使用 p[i] 来访问数组素,它等价于 arr[i]。 2) 使用指针 也就是使用 *(p+i) 的形式访问数组素。另外数组名本身也是指针,也可以使用 *(arr+i) 来访问数组素,它等价于 *(p+i)。 指针可变,数组名不可变 指针函数: 一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是函数指针。 函数指针的定义形式为: returnType (*pointerName)(param list); returnType 为函数返回值类型,pointerName 为指针名称,param list 为函数参数列表。参数列表中可以同时给出参数的类型和名称,也可以只给出参数的类型,省略参数的名称,这一点和函数原型非常类似。 注意的优先级高于,第一个括号不能省略,如果写作就成了函数原型,它表明函数的返回值类型为。 运行结果: Input two numbers:10 50↙ Max value: 50 pmax 是一个函数指针,在前面加 * 就表示对它指向的函数进行调用。注意的优先级高于,第一个括号不能省略。 指针作为参数: 在C语言中,函数的参数不仅可以是整数、小数、字符等具体的数据,还可以是指向它们的指针。用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁。 像数组、字符串、动态分配的内存等都是一系列数据的集合,没有办法通过一个参数全部传入函数内部,只能传递它们的指针,在函数内部通过指针来影响这些数据集合。 有的时候,对于整数、小数、字符等基本类型数据的操作也必须要借助指针,一个典型的例子就是交换两个变量的值。 从结果可以看出,a、b 的值并没有发生改变,交换失败。这是因为 swap() 函数内部的 a、b 和 main() 函数内部的 a、b 是不同的变量,占用不同的内存,它们除了名字一样,没有其他任何关系,swap() 交换的是它内部 a、b 的值,不会影响它外部(main() 内部) a、b 的值。 运行结果: a = 99, b = 66 调用 swap() 函数时,将变量 a、b 的地址分别赋值给 p1、p2,这样 *p1、*p2 代表的就是变量 a、b 本身,交换 *p1、*p2 的值也就是交换 a、b 的值。函数运行结束后虽然会将 p1、p2 销毁,但它对外部 a、b 造成的影响是“持久化”的,不会随着函数的结束而“恢复原样”。 需要注意的是临时变量 temp,它的作用特别重要,因为执行语句后 a 的值会被 b 的值覆盖,如果不先将 a 的值保存起来以后就找不到了。 这就好比拿来一瓶可乐和一瓶雪碧,要想把可乐倒进雪碧瓶、把雪碧倒进可乐瓶里面,就必须先找一个杯子,将两者之一先倒进杯子里面,再从杯子倒进瓶子里面。这里的杯子,就是一个“临时变量”,虽然只是倒倒手,但是也不可或缺。 参数的传递本质上是一次赋值的过程,赋值就是对内存进行拷贝。所谓内存拷贝,是指将一块内存上的数据复制到另一块内存上。 C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数。下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: 指针的总结: 指针(Pointer)就是内存的地址,C语言允许用一个变量来存放指针,这种变量称为指针变量。指针变量可以存放基本类型数据的地址,也可以存放数组、函数以及其他指针变量的地址。 程序在运行过程中需要的是数据和指令的地址,变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符:在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址;程序被编译和链接后,这些名字都会消失,取而代之的是它们对应的地址。
1) 指针变量可以进行加减运算,例如、、。指针变量的加减运算并不是简单的加上或减去一个整数,而是跟指针指向的数据类型有关。 2) 给指针变量赋值时,要将一份数据的地址赋给它,不能直接赋给一个整数,例如是没有意义的,使用过程中一般会导致程序崩溃。 3) 使用指针变量之前一定要初始化,否则就不能确定指针指向哪里,如果它指向的内存没有使用权限,程序就崩溃了。对于暂时没有指向的指针,建议赋值。 4) 两个指针变量可以相减。如果两个指针变量指向同一个数组中的某个素,那么相减的结果就是两个指针之间相差的素个数。 5) 数组也是有类型的,数组名的本意是表示一组类型相同的数据。在定义数组时,或者和 sizeof、& 运算符一起使用时数组名才表示整个数组,表达式中的数组名会被转换为一个指向数组的指针。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/29514.html