山东省住房城乡建设厅网站首页,科协网站建设的意见,快站科技是什么,商业网站的规划和设计四、数组的地址#xff08;继续前文编号#xff09; 数组是连续有序储存的同类型值#xff0c;只要获得首地址#xff08;第0个成员的内存地址#xff09;#xff0c;其它成员的地址也就知道了#xff0c;就能遍历整个数组。比如#xff0c;声明一个数组#x…四、数组的地址继续前文编号 数组是连续有序储存的同类型值只要获得首地址第0个成员的内存地址其它成员的地址也就知道了就能遍历整个数组。比如声明一个数组int arr[5]{1,2,3,4,5}; 又 int* parr[0]; 那么指针p中保存的就是数组 arr 的首地址故有*p值是1; ( 首个成员的值 )。C语言为简化计规定数组名等同于数组首地址即有 *parr; 。 如此把数组名传入一个函数就等同于传入一个指针变量。在函数内部就可以通过这个指针变量获得整个数组。 同理对于二维甚至多维数组数组名也是这些数组的首地址。 五、数组指针的加减计算 仍接上面的例子p是指向数组 arr 首地址指针*p的值是1接下来我们给p加上1此时 *(p1) 的值就是2也就是说首地址指针加上n则指针就指向第n个成员注意我们讲地址还有第几个成员均从0开始计然后用 *(pn) 就能取出这个地址的值。指针能加也能减减就是指针指向回退一个成员。十分注意的是指针加减后的结果不能越界。 由于指针p与数组名arr等价所以用*(arrn)来取第n个成员的值也是一样的。 关于数组的地址及指针加减运算我们用一个例子做说明
#includestdio.h
void myArr(int* arr)
{int* p arr; //p指向第0号成员int temp *p;printf(数组arr的第0号成员是%d\n, temp);p p 4;//p指向了第4号成员temp *p;printf(数组arr的第4号成员是%d\n, temp);p p - 2;//p从4回退2个位置指向2号成员temp *p;printf(数组arr的第2号成员是%d\n, temp);
}
int main(void)
{int arr[5] { 1,2,3,4,5 };myArr(arr);printf(-----------------------\n);printf(数组arr的第2号成员是%d\n, *(arr 2)); //用arr替代p进行计算getchar();return 0;
}
运行结果 数组arr的第0号成员是1 数组arr的第4号成员是5 数组arr的第2号成员是3 ----------------------- 数组arr的第2号成员是3 六、数组的复制 数组名字是指针所以复制数组名字并不是真正的复制数组而是复制了一个指针原指针和复制指针共同指向同一个数组如果原数组消失则复制的数组也不存在了。 简单的复制方法是利用循环一个成员一个成员的完成复制具体可看下面代码 int arr[5] { 1,2,3,4,5 };int arrBak[5] { 0 };for (int i 0; i 5; i) arrBak[i] arr[i]; //逐个成员复制for (int i 0; i 5; i) printf(%d , arrBak[i]); //显示复制结果
运行结果1 2 3 4 5复制完成 对于二维或者多维数组复制需要开双重循环或多重循环。 还有一种赋值方法就是调用memcpy() 函数直接把数组所在的那一段内存再复制出一份。memcpy()有3个参数 参1 目标数组名 参2 源数组名 参3 目标数组字节长度。见下例 int arr[5] { 1,2,3,4,5 };int arrBak[5];memcpy(arrBak, arr,sizeof(arrBak)); //完成复制for (int i 0; i 5; i) printf(%d , arrBak[i]); //显示复制结果
运行结果1 2 3 4 5结果与循环方法相同函数方法速度快于循环方法 说明由于版本不同memcpy是否包含在stdio.h不能确定如报错请包含string.h。 七、数组作为函数的参数 1. 数组作为函数的参数一般会同时传入数组名和数组成员数。由于数组名是一个指针如果只传数组名那么函数 只知道数组开始的地址不知道有几个成员。如果函数的参数是多维数组那么除了第一维的成员数可以当作参数传入函数 其他维的成员数需要写入函数参数声明。 2.数组字面量作为函数参数直接将数组字面量传入函数。方法是带有大括号的数组各成员的值直接放到参数名的位置后边再跟上数组成员数这个参数然后在大括号前面一对小括号括号里是函数数组参数声明但把数组名去掉。这种方式类似于用数组类型对传入的字面量数组成员值进行强转让编译器明白这组值的类型。 以上两项特别是第2项用语言表达不是很明白还是放到下面的例子中进一步说明代码如下 #includestdio.h
int mySum(int a[][5], int n)
{int sum 0;for (int i 0; i n; i){for (int j 0; j 5; j){sum a[i][j];}}return sum;
}
int main(void)
{ int arr[2][5] { {1, 2, 3, 4, 5},{6, 7, 8, 9, 10} };int summySum(arr, 2); //传入数组名及第一维成员数printf(%d\n, sum); //运算结果55sum mySum((int[][5]) { {1, 2, 3, 4, 5}, { 6, 7, 8, 9, 10 } }, 2);//将数组字面量直接及第一维成员数直接传入函数注意(int[][5])中无数组名只剩类型printf(%d\n, sum);//运算结果55getchar();return 0;
}