开篇前言:
主播大学时期不好好精进技术,导致会的方面很多,但是每个都不专精,主播考了两次研究生,都失败了。现在一边在教培机构工作,一边重新回火技术,希望可以帮到新人,也希望大佬可以指出我文章中的的问题,我希望我在可以生存的同时做我热爱的代码工作。就从梦开始的C语言开始吧!后续也会着眼于热门的开源项目复现
指针
指针基础
本质上指针就是数据所在内存的位置的标识,把数据看作人,指针看作你的唯一地址,那我可以根据你的地址找到你住的房子,从房子中找到你。这个房子就是内存存储单元的概念,而指针就是这所房子的地址,通过地址找到房中的你,就是我们所说的寻址过程。我认为干巴巴的概念永远不如实际代码来的快,每行代码都有详细的注释,根据代码实例,可以更深层次的理解概念。
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
void swap(int *a,int *b);
int main()
{
int a =10;
int * p = &a;//将变量地址赋值给指针变量p,&a就代表a的地址
printf("%p\n",p);//看地址的时候用%p表示
printf("%d",*p);//取值用*p
swap(&a,&b);//再次提醒,地址用&来表示,形式参数是指针变量,要把地址传给函数必须传入具体地址
const int *p;
int * const p;
/*
这两行代码的含义完全不同
第一行代表变量A的值不可修改,
第二行代表指针变量p的值不可修改
*/
}
void swap(int *a,int *b){
int temp = *a;
*a = *b;
*b = temp;
}
指针在数组中的应用
一维数组
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
char str []= "Hello World!";
char *p = str;//在给指针变量赋数组首地址时候,直接让变量名等于数组变量名,因为声明数组本来就是把确定长度的地址空间分配出去,数组变量本质上就是一个指针,其内容是存储在这片空间的数据
printf("%c",*(p+1));//*(p+1)是指下一个变量,*p+1是指取值加一,*(p+1)和&str[1]一个意思
}
二维数组
int main()
{
int arr[][3] ={
{1,2,3},
{4,5,6}
};//定义二维数组,其外层维数可以不定,但是内层维数一定要确定;二维数组本质上是一个存储多个一维数组地址的一维指针变量数组,首元素就是内层第一个一维数组的地址,把这个值赋给指针变量,即可找到二维数组首元素
//*(p+4)==arr[1][1]
int *p =arr[0];
for(int i =0;i<6;++i){
printf("%d ",*(p+i));
}
return 0;
}
多级指针
创建变量时候每多一层*就多一层指针,二级指针不能在二维数组中使用
指针数组与数组指针
指针数组是指数组中每个变量都是指针变量,数组指针则是每一个数组所分配内存空间的首地址
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
int arr[3];//
int *arr[3]={&a,&b,&c};
}
指针函数与函数指针
指针函数
返回值是指针的函数
int *test(int *a){
}//尽量不要返回局部变量的地址,因为可能会被重新分配
函数指针
OS为函数代码分配的首地址
int sum(int a,int b){
return a+b;
}//函数名就是函数在编码中首地址的指代
int main()
{
int (*p)(int,int) = sum;//命名规则:返回值类型 (*p)(函数需要的参数) = 函数名
int result = p(1,2);//可以通过指针调用函数
printf("%d",result);
}
函数指针的应用-函数回调
函数回调是指把函数指针作为入参被其他函数所调用,注意传入函数指针所代表的原函数的参数在函数回调时也要去一同作为调用参数传入
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int Max(int a,int b);
int Sum(int (*p)(int ,int ) ,int a,int b,int c );//这里Sum函数回调了Max函数,其中a,b是Max函数所需的参数 ,不要忘记声明和实现时候把回调函数的参数也加上
int main()
{
int a =10,b = 20,c = 30;
int (*p)(int,int) = Max;
int result = Sum(p,a,b,c);
printf("%d",result);
}
int Max(int a,int b){
return a>b?a:b;
}
int Sum(int (*p)(int,int),int a,int b,int c){
return p(a,b)+c;
}
下期预告
结构体