this指针 对象数组 常类型
- 格式:ppt
- 大小:136.00 KB
- 文档页数:24


数组和指针的区别数组和指针是C语言中非常重要的两个概念,它们在编写程序时起着极其重要的作用。
虽然它们在某种程度上非常相似,但它们之间也存在着很多的差异,下面我们就来分析一下它们的区别。
1. 定义方式数组是由一组具有相同类型的数据元素所组成的有序集合,每个元素具有相同的数据类型,可以通过下标在数组中访问对应的元素。
在C中,定义一个数组可以使用以下语句:```int arr[10];```这个语句定义了一个名为arr的整型数组,这个数组有10个元素。
而指针是一个变量,它存放了一个内存地址,这个地址与它存储的数据类型有关。
在C中,定义一个指针可以使用以下语句:```int *p;```这个语句定义了一个名为p的指针,这个指针指向一个整型变量。
2. 内存分配数组在定义时要求需要一定的内存空间来存储数组元素,因此在定义时就已经确定了内存空间的大小,且数组的大小不可改变。
例如,如果定义一个大小为10的数组,则它的大小就是10,无论实际使用时需要存储的元素个数是多少,数组的大小都不会改变。
而指针在定义时只需要分配一个指针变量所需的内存空间,该指针可以在程序运行时动态地分配内存,因此指针所指向的内存空间大小不确定,需要在运行时根据需要动态地分配或释放空间。
3. 访问方式在数组中,可以通过数组的下标来访问数组中具体的元素,下标从0开始,最大下标为数组大小减1。
例如,访问arr数组中的第三个元素可以写成:arr[2]。
而对于指针,可以通过指针变量所指向的地址来访问该地址所对应的值。
例如,访问p指针所指向地址上的整型变量可以写成:*p。
4. 传递方式在函数调用时,数组可以通过值传递或指针传递来传递数组的值。
如果数组作为参数传递给函数时,实际上传递的是该数组的地址,即使数组非常大,也不会导致栈溢出。
而对于指针,只能通过指针传递方式来传递指针变量的值,在函数内部可以通过指针来修改该指针所指向的地址所存储的值,因此指针可以用来传递地址或修改变量的值。
理解C语⾔(⼀)数组、函数与指针1 指针⼀般地,计算机内存的每个位置都由⼀个地址标识,在C语⾔中我们⽤指针表⽰内存地址。
指针变量的值实际上就是内存地址,⽽指针变量所指向的内容则是该内存地址存储的内容,这是通过解引⽤指针获得。
声明⼀个指针变量并不会⾃动分配任何内存。
在对指针进⾏间接访问前,指针必须初始化: 要么指向它现有的内存,要么给它分配动态内存。
对未初始化的指针变量执⾏解引⽤操作是⾮法的,⽽且这种错误常常难以检测,其结果往往是⼀个不相关的值被修改,并且这种错误很难调试,因⽽我们需要明确强调: 未初始化的指针是⽆效的,直到该指针赋值后,才可使⽤它。
int *a;*a=12; //只是声明了变量a,但从未对它初始化,因⽽我们没办法预测值12将存储在什么地⽅int *d=0; //这是可以的,0可以视作为零值int b=12;int *c=&b;另外C标准定义了NULL指针,它作为⼀个特殊的指针常量,表⽰不指向任何位置,因⽽对⼀个NULL指针进⾏解引⽤操作同样也是⾮法的。
因⽽在对指针进⾏解引⽤操作的所有情形前,如常规赋值、指针作为函数的参数,⾸先必须检查指针的合法性- ⾮NULL指针。
解引⽤NULL指针操作的后果因编译器⽽异,两个常见的后果分别是返回置0的值及终⽌程序。
总结下来,不论你的机器对解引⽤NULL指针这种⾏为作何反应,对所有的指针变量进⾏显式的初始化是种好做法。
如果知道指针被初始化为什么地址,就该把它初始化为该地址,否则初始化为NULL在所有指针解引⽤操作前都要对其进⾏合法性检查,判断是否为NULL指针,这是⼀种良好安全的编程风格1.1 指针运算基础在指针值上可以进⾏有限的算术运算和关系运算。
合法的运算具体包括以下⼏种: 指针与整数的加减(包括指针的⾃增和⾃减)、同类型指针间的⽐较、同类型的指针相减。
例如⼀个指针加上或减去⼀个整型值,⽐较两指针是否相等或不相等,但是这两种运算只有作⽤于同⼀个数组中才可以预测。
指针数组作为函数形参一、什么是指针数组指针数组是由若干个指针变量组成的数组,每个元素都是一个指针变量。
它可以用来存储多个指向同一类型的变量的地址。
二、为什么要使用指针数组作为函数形参使用指针数组作为函数形参可以方便地传递一个数组,同时也可以避免在函数中对数组进行复制,提高程序的效率。
此外,使用指针数组还可以使得函数的参数更加灵活和通用。
三、如何定义和初始化指针数组定义方式:数据类型 * 数组名 [元素个数];例如:int *p[5];初始化方式:1.逐个初始化每个元素int a = 1, b = 2, c = 3, d = 4, e = 5;int *p[5] = {&a, &b, &c, &d, &e};2.使用循环语句初始化int a[5] = {1, 2, 3, 4, 5};int *p[5];for (int i=0; i<5; i++) {p[i] = &a[i];}四、如何将指针数组作为函数形参传递将指针数组作为函数形参传递时,需要注意以下几点:1.在函数声明和定义中都需要明确指出参数类型为指向某种数据类型的指针数组。
void func(int *p[]);2.传递指针数组时,只需要传递数组名即可。
因为数组名本身就是一个指向数组首元素的指针。
int a[5] = {1, 2, 3, 4, 5};func(a);3.在函数中,可以通过下标或指针的方式访问指针数组中的元素。
void func(int *p[]) {for (int i=0; i<5; i++) {printf("%d\n", *p[i]);}}五、完整代码示例#include <stdio.h>void func(int *p[]);int main() {int a[5] = {1, 2, 3, 4, 5};int *p[5];for (int i=0; i<5; i++) {p[i] = &a[i];}func(p);return 0;}void func(int *p[]) {for (int i=0; i<5; i++) {printf("%d\n", *p[i]);}}六、总结使用指针数组作为函数形参可以方便地传递一个数组,同时也可以避免在函数中对数组进行复制,提高程序的效率。