【C语言】规范掌握C语言函数 数组名的妙用 指针快速入门 综合使用小案例_c语言函数名 数组名字指针

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


### 1.3、有参无返


这里有整型参数`a`和`b`,调用该函数就能自动打印出二者中的较大值



void contrast(int a,int b)
{
int c = 0;
if (a > b)
c = a;
else
c = b;
printf(“最大值为:%d”, c);
}


### 1.4、有参有返


这里调用`getMin`函数会得到二者中的较小值



int getMin(int a, int b)
{
return a < b ? a : b;
}


### 1.5、主函数中的调用及运行效果


*调用四个函数:*


![在这里插入图片描述](https://img-blog.csdnimg.cn/835a3944faf74669b4c89e998a098fe5.png)


*运行效果:*


![在这里插入图片描述](https://img-blog.csdnimg.cn/742ffc8bb941480a8866a3c7ae2db30b.png)


## 2、C语言数组创建和基本操作


**数组概念:一组有序数据的集合**


数组特点:


* **数组的地址在一段内存空间中连续**
* **数组中的每一个元素都属于同一个数据类型**
* **数组从零开始计数,不能访问越界元素**
* **数组名代表该数组的首地址**
	+ 因此数组除了写成:`int A[5]`; 还可以写成:`int *A`
	+ 这两种定义方式下,数组名A都代表着地址


### 2.1、数组创建的方式


*一维数组创建的方式:*



//1、直接创建,不初始化,要给数组确定的大小
int A[10];
//2、创建时赋值,使用大括号,此时可省略中括号的值,例如:int B[]={3,1,2};
int B[3]={3,2,1};
//3、全部初始化为0
int C[32]={0};




---


*二维数组创建的方式:*



//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的值,二者的输出结果都会保持一致。


*图解:*  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/4d6bf44f6ed9476ca1ff31bfaab6a4b8.png)  
 假如变量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;


* 空指针用于给指针变量进行**初始化**
* 空指针是**不可以进行访问**的




---


**野指针:**  
 就是指向的内存地址是未知的(随机的,不正确的,没有明确限制的)。


指针变量也是**变量**,是变量就可以任意赋值。但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了**野指针**,此指针指向的区域是**未知**(操作系统不允许操作此指针指向的内存区域)。


**注意:野指针不会直接引发错误,操作野指针指向的内存区域才会出问题**


导致空指针的原因:


1. 指针未初始化
	* 跟空指针类似
2. 指针越界访问
	* 例如:用指针遍历数组时超过了数组的边界
3. 指针释放后未置空
	* 只是将指针`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);
}




![img](https://img-blog.csdnimg.cn/img_convert/20f618389c639cfa6767338b06f0c3fc.png)
![img](https://img-blog.csdnimg.cn/img_convert/228daeea0981a0b960ee1d2685ba4aad.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

tf("b=%d",b);
}

[外链图片转存中…(img-FUDzuJpo-1715695888420)]
[外链图片转存中…(img-RTY78BLo-1715695888420)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值