25深入理解C指针之---传递数组
一、传递数组:将数组作为参数传入函数,或将数组作为数据当成是函数的返回值
1、定义:可以传入和传出数组
2、特征:
1)、将数组作为参数传递给函数的本质是传递数组的地址,这种传递无需复制数组元素,所以更加高效;
2)、数组名自身暗中包含了数组的大小,传递过程中只包含地址,因而丢失了数组大小信息;
1 #include <stdio.h> 2 3 void displayArr(int arr[]){ 4 for(int i = 0; i < 10; i++){ 5 printf("%d\t", arr[i]); 6 } 7 printf("\n"); 8 9 return; 10 } 11 12 int main(int argc, char **argv) 13 { 14 int arrInt[] = {1, 2, 3, 4, 5, 6, 7, 8,}; 15 16 displayArr(arrInt); 17 18 return 0; 19 }
说明:由于在displayArr()函数中缺少了数组长度,由于盲目指定了数组长度,因此会输出多余的垃圾值。
3)、将数组作为参数时,可以使用数组表示法,arrName[]表示法;
1 #include <stdio.h> 2 3 void displayArr(int arr[], int size){ 4 for(int i = 0; i < size; i++){ 5 printf("%d\t", arr[i]); 6 } 7 printf("\n"); 8 9 return; 10 } 11 12 int main(int argc, char **argv) 13 { 14 int arrInt[] = {1, 2, 3, 4, 5, 6, 7, 8,}; 15 int size = sizeof(arrInt) / sizeof(int); 16 displayArr(arrInt, size); 17 18 return 0; 19 }
说明:由于在displayArr()函数声明中使用数组表示法,传入了数组长度,在函数内部使用数组法(也可以使用指针法),保证了程序的健壮行。
4)、将数组作为参数时,可以使用指针表示法,*arrName表示法;
1 #include <stdio.h> 2 3 void displayArr(int *arr, int size){ 4 for(int i = 0; i < size; i++){ 5 printf("%d\t", *(arr + i)); 6 } 7 printf("\n"); 8 9 return; 10 } 11 12 int main(int argc, char **argv) 13 { 14 int arrInt[] = {1, 2, 3, 4, 5, 6, 7, 8,}; 15 int size = sizeof(arrInt) / sizeof(int); 16 displayArr(arrInt, size); 17 18 return 0; 19 }
说明:由于在displayArr()函数声明中使用指针表示法,传入了数组长度,在函数内部使用指针法(也可以使用数组法),保证了程序的健壮行。
5)、采用指针表示法和采用数组表示法必须传入数组的长度;
3、指针数组的应用:
1)、声明方式:int* arrName[size],此时数组中的元素是指针,若需要获取指针的内容,需要使用解析操作符;
2)、数组元素需要手动分配内存空间;
3)、使用数组表示法获取数组元素的内容:*arrName[index]获取指针内容;
4)、arrName[index] 等价于(*arrName + index),切记其中存储的是整型指针
5)、使用*arrName[index]获取数组下标对应的地址处的内容
6)、使用指针表示法获取数组元素的内容:*(*arrName + index)获取指针内容;
7)、(*arrName + index)等价于arrName[index],切记其中存储的是整型指针
8)、使用*(*arrName + index)获取指针运算后对应的地址处的内容
9)、如果不能确定具体的方式,就在初始化和输出使用同一种方式
10)、在代码2中如果在初始化时,使用第10行代码的形式,可以使用第15行代码输出数据
11)、在代码2中如果在初始化时,使用第10行代码的形式,可以使用第16行代码输出数据
12)、在代码2中如果在初始化时,使用第10行代码的形式,可以使用第18行代码输出数据
13)、在代码2中如果在初始化时,使用第11行代码的形式,可以使用第17行代码输出数据
14)、在代码2中如果在初始化时,使用第11行代码的形式,可以使用第18行代码输出数据
代码如下代码1:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void displayArr(int **arr, int size){ 5 for(int i = 0; i < size; i++){ 6 printf("%d\t", *(*arr + i)); 7 } 8 printf("\n"); 9 10 return; 11 } 12 13 int main(int argc, char **argv) 14 { 15 int size = 6; 16 int* arrInt[size]; 17 for(int i = 0; i < size; i++){ 18 *(arrInt + i) = (int *)malloc(sizeof(int)); 19 *(*arrInt + i) = i + 1; 20 } 21 displayArr(arrInt, size); 22 23 return 0; 24 }
再看下面的代码代码2:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main(int argc, char **argv) 5 { 6 int size = 5; 7 int* arrInt[size]; 8 for(int i = 0; i < size; i++){ 9 arrInt[i] = (int *)malloc(sizeof(int)); 10 //*arrInt[i] = 101 + i; 11 *(*arrInt + i) = 101 + i; 12 } 13 14 for(int i = 0; i < size; i++){ 15 //printf("%d\t", arrInt[i][0]); 16 //printf("%d\t", *arrInt[i]); 17 //printf("%d\t", *(*arrInt + i)); 18 printf("%d\t", **arrInt + i); 19 } 20 21 return 0; 22 }
3、传出,将数组返回