目录
1.数组名的理解
sizeof(数组名),sizef中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
&数组名,这里的数组名表示整个数组,取出的是整个数组的地址 (整个数组的地址和数组首元素的地址是有区别的)
2.使用指针访问数组
arr[i]==>*(arr+i)等价
数组与指针的联系:
3.一维数组传参的本质
4 .冒泡排序
5.二级指针
解引用
6.指针数组
指针数组是数组还是指针?
7.指针数组模拟二维数组
1.数组名的理解
我们发现数组名和数组首元素的地址打印出的结果一模一样,数组名就是数组首元素(第一个元素)的地址。
数组名如果是数组首元素的地址,那下面的代码怎么理解呢?
输出的结果是:40,如果arr是数组首元素的地址,那输出应该的应该是4/8才对。
其实数组名就是数组首元素(第一个元素)的地址是对的,但是有两个例外:
sizeof(数组名),sizef中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
&数组名,这里的数组名表示整个数组,取出的是整个数组的地址 (整个数组的地址和数组首元素的地址是有区别的)
除此之外,任何地方使用数组名,数组名都表示首元素的地址。
图解:
2.使用指针访问数组
为什么访问数组的时候可以使用指针呢?
1.数组在内存中是连续存放的
2.指针+-整数运算,方便我们获得每一个元素的地址
int main()
{int arr[10] = { 0 };//使用指针来访问数组int sz = sizeof(arr) / sizeof(arr[0]);//输入10个值int* p = arr;int i = 0;for (i = 0; i < sz; i++){//输入1个值scanf("%d", p+i);//p+i == &arr[i]}//输出10个值for (i = 0; i < sz; i++){printf("%d ", i[arr]);//p[i] arr[i] *(arr+i)}return 0;
}
arr[i]==>*(arr+i)等价
1.数组就是数组,是一块连续的空间(数组的大小和数组元素个数和元素类型都有关系)
2.指针(变量)就是指针(变量),是!一个变量(4/8个字节)
数组与指针的联系:
3.数组名是地址,是首元素的地址
4.可是使用指针来访问数组
3.一维数组传参的本质
打印的值为1,是指针变量的大小,不是数组的大小
数组传参的时候,形参是可以写成数组的形式的
但是本质上还是指针变量void Print(int arr[10])//int* arr
{int sz = sizeof(arr) / sizeof(arr[0]);//得不到元素个数的,算出来的是指针变量的大小int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}void Print(int* p,int sz) //应该是指针
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", *(p + i));}
}int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);Print(arr, sz);//arr 数组名就是数组首元素的地址//sizeof(arr)//&arrreturn 0;
}
1. 数组传参的本质是传递了数组首元素的地址,所以形参访问的数组和实参的数组是同一个数组的。
2.形参的数组是不会单独再创建数组空间的,所以形参的数组是可以省略掉数组大小的。
总结:一维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。
4 .冒泡排序
冒泡排序的核心思想:就是两两相邻的元素进行比较。
图示:
代码如下:
升序
void bubble_sort(int arr[], int sz)
{int i = 0;//趟数for (i = 0; i < sz - 1; i++){//假设已经有序了int flag = 1;//一趟排序的过程int j = 0;for (j = 0; j < sz-1-i; j++){if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;flag = 0;}}if (flag == 1){break;}}
}void print_arr(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}int main()
{int arr[] = { 9,8,7,6,5,4,3,2,1,0 };//排序int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz);//打印print_arr(arr, sz);return 0;
}
避免已经排序结束了,但是还在循环
5.二级指针
int main()
{int a = 10;int* p = &a;//p就是一级指针int * * pp = &p;int** * ppp = &pp;int**** pppp = &ppp;//.....return 0;
}
解引用
6.指针数组
指针数组是数组还是指针?
是数组!
eg:好孩子,主语是孩子
我们类比一下,整型数组,是存放整型的数组,字符数组是存放字符的数组。
那指针数组呢?是存放指针的数组。
7.指针数组模拟二维数组
并不是真的二维数组,只是模拟出来的
图解:
parr[]是访问parr数组的元素,parr[i]找到的数组元素指向了整型一维数组,parr[i][j]就是整型一维数组中的素。
上述的代码模拟出二维数组的效果,实际上并非完全是二维数组,因为每一行并非是连续的。
希望对你有帮助!加油各位!!
每一次努力都是不凡的历练,每一点进步都是值得庆祝的胜利。你正在创造属于自己的辉煌,相信自己,一切皆有可能。