数组和指针的区别
1.数组和数组第一个元素
#include<stdio.h>
void main() {
int arr[] = { 5,8,6,9,3,4,1,7,2,0 };
//arr = { 2,5,1 };数组名是常量,不可被赋值,这么操作报错
int* p = arr;
printf("数组的地址:%p\n", arr);
printf("数组第一个元素的地址:%p\n", &arr[0]);
printf("p的值:%p\n", p);
}
返回的结果
数组的地址:000000457811FA88
数组第一个元素的地址:000000457811FA88
p的值:000000457811FA88
上述表明数组其实就是数组第一个元素的位置,arr就是一个地址,所以arr复制给p没问题
2.数组的遍历
void main() {
int arr[] = { 5,8,6,9,3,4,1,7,2,0 };
int* p = arr;
printf("int类型指针大小%d\n", sizeof(int*));//输出8
printf("p指针大小%d\n", sizeof(p));//输出8
printf("第一个元素指针大小%d\n", sizeof(&arr[0]));//输出8
printf("数组大小%d\n", sizeof(arr));//输出40
//int类型的指针在x64机器里面占用8个字节,int本身占四个字节。
for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++){
printf("数组下标=%d,值=%d\n", i, arr[i]);
}
//使用p代替arr,完全没问题
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
printf("数组下标=%d,值=%d\n", i, p[i]);
}
}
//上面i对打可以为9,当手工输出p[10]的时候也会发生下标越界
3.p的运算
void main() {
int arr[] = { 5,8,6,9,3,4,1,7,2,0 };
int* p = arr;
printf("p的值:::::::::%p\n", p);
printf("第一个元素位置%p\n", &arr[0]);
printf("对p取值%d\n", *p);
p++;
printf("p的值:::::::::%p\n", p);
printf("第二个元素位置%p\n", &arr[1]);
printf("对p取值%d\n", *p);
}
结果分析:指针加数字得到的还是指针,并且加1,向后移动了四个字节(int类型),直接对该地址取值也能说明情况
4.数组排序
//1.简单的冒泡排序
void main() {
int arr[] = { 5,8,6,9,3,4,1,7,2,0 };
int* p = arr;
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
printf("数组下标=%d,值=%d\n", i, arr[i]);
}
//sort(arr);
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]) - 1; i++) {
for (int j = 0; j < sizeof(arr) / sizeof(arr[0]) - i - 1; j++)
{
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
printf("数组下标=%d,值=%d\n", i, p[i]);
}
}
//结果成功
void sort(int arr[]) {
for (int i = 0; i < sizeof(arr)/sizeof(arr[0])-1; i++){
for (int j = 0; j < sizeof(arr) / sizeof(arr[0])-i-1; j++)
{
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
void main() {
int arr[] = { 5,8,6,9,3,4,1,7,2,0 };
int* p = arr;
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
printf("数组下标=%d,值=%d\n", i, arr[i]);
}
sort(arr);
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
printf("数组下标=%d,值=%d\n", i, p[i]);
}
//排序失败,debug调试一下
}
如图,在上面显示arr[0]还是5,还是sizeof(arr)确实8,对arr取值 *arr却等于5,sort方法接受的其实是一个指针,
因此冒泡排序失败
总结:
1.数组就是一堆连续的数,数组名就是数组中第一个元素的地址,数组名一旦确定就不能改变,数组的使用方式指针也能使用,基本遍历赋值都可以
2.指针是什么:指针是一个变量,里面值有特殊意义,代表的是内存地址
3.指针的加减数字其实是对地址进行偏移,偏移的大小和数据类型有关系,指针之间减法得到的就是偏移量
3.数组作为参数接收时,其接收的是指针这时候数组的长度信息就会丢失
记录于此!
来源:CSDN
作者:平原人
链接:https://blog.csdn.net/weixin_43328357/article/details/104518014