既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
二维数组创建的方式:
//1、不初始化,规定好行数和列数
int A[3][4];
//2、全部初始化为0
int B[2][3] = { 0 };
//3、给特定部分赋值,这里的行的大小可以省略,因为编译器可以根据赋值情况推断出有四行数据
int C[][5] = { {0},{1},{1,2,3,4,5},{3} };
2.2、数组元素的引用
使用数组名加数组下标就可以访问数组里的元素:
int A[5]={1,3,2,5,4};
for(int i=0;i<5;i++)
{
printf("%d ",A[i]);
}//打印结果:1 3 2 5 4
当然也可以修改数组相应位置的元素:
int A[4]=66;//此时再访问结果就变为了66
这里唯一要注意的就是不要越界访问,访问A[5]
是非法的,因为该数组最大才到A[4]
2.3、有关数组名的干货小知识
利用sizeof
关键字可计算出一个数组的大小:
int A[]={1,5,3,5,8,4,3};
int len = sizeof(A)/sizeof(A[0]);//代码执行结果为7
sizeof
可以计算一个数据类型所占内存空间的大小,而放入数组名就可以计算整个数组所占内存空间的大小,然后除以一个数组元素占用的内存大小就能得到元素总数了。
可直接利用数组名的操作给数组赋值:
int A[5];
int i = 0;
while (i < 5) {
scanf("%d", A + (i++));
}
我们都知道
scanf
是把我们键盘输入的值赋给特定的地址对应的内存单元,这里我的scanf虽然没有&
符号,但是让我们慢慢分析:
- 当i为0时,
A+(i++)
的结果还是A,而A又代表数组的首地址,那么这个数据就赋给了A[0]- 上一步经过
i++
,之后i为1,A+(i++)的结果是A+1
,而地址的+1不是加一个字节,而是一块内存,在这个数组里就是+4
,对应A[1]的位置。因此第二个数据赋值给了A[1]
。- 以此类推,当i为5时,
A+4
对应的位置A[4]
也完成了赋值,i<5不成立,循环结束,数组完成赋值。
3、C语言指针
都知道指针指向地址,让我用下面的分享来解读这句话
3.1、指针的定义和使用
形式如下:
int a = 6;
int \*p = &a;
或者:
int a = 6;
int \*p;
p = &a;
两种定义方式的效果完全一致,指针p
指向的是变量a
的地址,*p
代表的就是变量a的值。
此时无论是更改a或者*p的值,二者的输出结果都会保持一致。
图解:
假如变量a占用了内存中0X01
的内存单元,此时p也是指向此内存单元,当修改a的值时,p的指向并不发生改变,因此*p
的值会随着a的改变而改变,反之也一样。
3.2、指针所占内存空间
我们该怎么计算一个数据类型占用内存空间的大小呢?可以使用sizeof
关键字。
例如:
int a = 66;
double b=1.0;
printf("%d",sizeof(a));//结果为4
printf("%d",sizeof(b));//结果为8
不仅如此,sizeof
形参列表里可以直接传入数据类型:
printf("%d",sizeof(int));//4
printf("%d",sizeof(float));//4
printf("%d",sizeof(double));//8
printf("%d",sizeof(char));//1
指针所占内存空间大小:
printf("%d",sizeof(int \*));//8
printf("%d",sizeof(double \*));//8
printf("%d",sizeof(char \*));//8
结论:指针所占空间在x86即32操作系统下大小均为4;在x64操作系统下大小均为8
3.3、空指针和野指针
空指针:
int \*p = NULL;
- 空指针用于给指针变量进行初始化
- 空指针是不可以进行访问的
野指针:
就是指向的内存地址是未知的(随机的,不正确的,没有明确限制的)。
指针变量也是变量,是变量就可以任意赋值。但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)。
注意:野指针不会直接引发错误,操作野指针指向的内存区域才会出问题
导致空指针的原因:
- 指针未初始化
- 跟空指针类似
- 指针越界访问
- 例如:用指针遍历数组时超过了数组的边界
- 指针释放后未置空
- 只是将指针
free
掉了,未将NULL赋值给该指针
- 只是将指针
4、三者的综合使用
4.1、指针和函数小案例
利用指针和函数结合写一个地址传递的交换函数:
void swap(int\* a, int\* b) {
int temp = \*a;
\*a = \*b;
\*b = temp;
}
int main()
{
int a = 10, b = 20;
swap(&a, &b);
printf("a=%d",a);
printf("b=%d",b);
}
地址传递能够影响实参,因为这里传进去的是变量地址,形参能够修饰实参
4.2、指针和数组小案例
使用指针的递增访问数组中所有的元素值:
#include<stdio.h>
int main()
{
int arr[] = {1,5,3,4,8,32,2,8,9,6};
int len = sizeof(arr) / sizeof(arr[0]);//计算数组长度
int\* p = arr; //p指向数组首地址
for (int i = 0; i <len; i++) {
printf("%d ", \*p); //p是地址,\*p才是地址对应的值
p++;
}
//p++意为p指针向后偏移四个字节,因为数组中地址连续,所以就是下一个数组的元素
}
运行效果:
4.3、数组和函数小案例
这里应该算不上案例,不过要熟悉数组作为函数参数的写法
做一个为数组赋值的函数:
void setArr(int A[],int len)
{
for (int i = 0; i < len; i++) {
scanf("%d", &A[i]);
}
printf("赋值已经就绪!\n");
}
做一个遍历输出数组元素的函数:
void getArr(int \*A,int len)
{
printf("打印数组中的所有元素:\n");
for (int i = 0; i < len; i++) {
printf("%d ", A[i]);
}
}
从这里可以看出数组作为函数的形参有两种形式,
int A[]
和int *A
,二者本质都是一样的。
那么此篇博客就到此结束了,二级考试将至,希望大家都能蟾宫折桂,取得佳绩!
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
存中…(img-e8yis9kc-1715346922885)]
[外链图片转存中…(img-cjxyuzIS-1715346922885)]
[外链图片转存中…(img-pAEkjFz8-1715346922885)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新