从零学编程-C语言-第13天

今天是学习C语言的第13天

时间:2024/9/26 21:37分

使用编译器:vs2019

此贴记录自己的成长

今天学习内容如下

C语言要实现简单数据结构,必须学好 指针 结构体 动态内存管理

1.字符指针

char ch = 'a'; //字符
char *p = &ch; //字符指针
char * p = "abcdef"; //此时p的地址是字符串里面a的地址,也就是首元素地址
char * p = "abcdef"; //这种写法有的编译器会报错,可加一个const 改成常量即可

const char * p1 = "abc";
const char * p2 = "abc";
//此时 p1 == p2,因为常量无法修改,常量存储在计算机的只读区内,为了节省内存,两个指针指向同一空间
char arr1[] = "abc"; 
char arr2[] = "abc";
//此时 arr1 != arr2  这两个是单独开辟空间

2.指针数组

//指针数组是数组。存放指针的数组,数组里的每个元素都是指针变量类似的
int arr[10] //整型数组 元素类型 int
char arr[10] //字符数组 元素类型 char
int * arr[10] //指针数组 ,元素类型 int *
char * arr[10] //指针数组,元素类型 char *
//指针数组作用:可将几个一维数组结合起来变二维数组
//例如
int arr1[4] = {1,2,3,4};
int arr2[4] = {2,3,4,5};
int arr3[4] = {3,4,5,6};
//如果我们想将每个数组再存到一个数组里
arr = {arr1,arr2,arr3} //肯定是不行的,存不进去,因为数组名代表首地址,是地址类型的
//数组名一般代表首地址,两种情况除外 1.sizeof(数组名)此时代表整个数组 2.&arr 此时取的地址是整个数组地址
//此时就可以使用指针数组
int * arr[3] ={arr1,arr2,arr3};
//然后我们就可以通过for循环输出二维数组的方式输出这三个一维数组内容
for(int i = 0;i<3;i++)
 for(int j = 0;j<4;j++)
      printf("%d",*(arr[i]+j));
      // *(p+i) = p[i] 所以直接
      pirntf("%d",arr[i][j]);

3.关于数组名代表内容

int arr[10] ={0};
printf("%p",arr);
printf("%p",&arr[0]);
printf("%p",&arr);
//%p 是专门用来打印地址的
//这三个打印结果一致,但前两个是首元素地址,最后一个是整个元素地址
//数组名通常表示数组首元素地址,2个例外 sizeof(数组名) &数组名 都是取的整个数组地址,不是单个,一单加1,直接跳过整个数组,不是跳过单个元素
int arr[10]={0};
int * p = arr; 
//整型指针是用来存放整型的地址
//字符指针是用来存放字符的地址
//数组指针是用来存放数组的地址
int * p = &arr; //写法错误,报错
int (*p)[10] = &arr; //数组指针

4.数组指针

int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int (*p)[10] = &arr; //必须写长度
//p是指向数组的,对p解引用 *p其实就是数组名,也就是首元素地址
//*p+i 元素地址
//*(*p+i) 元素
//这种用法很别扭,一般不用

//数组指针作用:如下
int arr[3][5] = {0};
function(arr);
//如果要传参给函数,那么形参可以怎么写呢
// 1.直接原样写 int arr[][5]
// 2.数组指针 int (*arr)[5] 一个数组里面存放5个元素  arr指向每个二维数组的一维数组
    arr+i 表示某一行的地址

5.一维数组传参

int arr1[10];
int *arr2[10];

实参:
fun1(arr1);
fun2(arr2)

形参:
fun1(int arr[])
fun1(int arr[10])
fun1(int *arr)
fun2(int *arr[20])
fun2(int **arr)

6.二维数组传参

int arr[10][10];

实参:
fun1(arr)

形参:
fun1(int arr[][10])
fun1(int arr[10][10])
fun1(int (*arr)[5])

7.一级指针传参

int arr[10];
int * p =arr;

实参:
fun(p)

形参:
fun(int *p)

8.二级指针传参

int n = 10;
int *p =&n;
int **q =&p;

实参:
fun(q)
fun(&p)

形参:
fun(int ** p)

9.函数指针

指向函数的指针就是函数指针
int arr[5]={0};

&函数名取出来的就是函数的地址,如果不加&也可以
函数名就代表函数的地址

int(*p)(int,int) = &Add
int sum = (*p)(1,2) 使用函数指针的方式 *p也可以去掉* 因为函数名就是地址,p也是地址

函数指针作用:
可以让函数不用在函数里面新调用,直接将函数作为实参传过去,通过解引用方式调用函数
为什么不直接调用函数呢,要这么麻烦,因为还没学到高级玩法

C语言学习日志

时间:2024/9/26 21:37分

目标:一个月学完c语言

每天更新,不断更 

倒计时:17天

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值