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

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

时间:2024/9/27 21:14分

使用编译器:vs2019

此贴记录自己的成长

今天学习内容如下

指针与sizeof strlen之间漏了冒泡排序.9.27-9.29

1.指针数组

//指针数组
*arr[4] 是个数组 ,类型是指针, 元素都是指针
int* arr[4] 4个元素都是int * 类型的
指针数组有什么用呢,如下
int arr1 = { 1,2,3,4 };
int arr2 = { 2,3,4,5 };
int arr3 = { 3,4,5,6 };
那我现在想建一个新数组,将这三个数组都放进去
int arr[] = { arr1,arr2,arr3 }; 这样显然是不行的,因为数组名代表首地址
那么可以用 int* arr[] = { arr1,arr2,arr3 };
arr[0] = arr1 那么就有 arr[0][0] = arr[1][0] = 1
这样一来变成了二维数组, 指针数组可以将一些一维数组结合起来,变二维数组
只要类型匹配,就能放进去
指针数组也有二级指针 int** arr[];

2.数组指针

//数组指针
存放数组的指针,本质是指针
int(*arr)  [4];
指针变量里面存放的是数组的地址
这个指针里面存放的int 数组
指针变量指向一个存放一个含有4个int元素的数组
int arr[10] = { 0 };
int* p = arr; arr是首元素地址,可以直接存p里
那么如果是要存& arr呢,& arr拿到的是整个数组地址
这个时候需要数组指针了,
int(*p)[10] = &arr;
举个例子
int* p = &a
int(*p)[10] & arr
这俩一样,懂了吗
数组指针存数组地址
整型指针存整型地址

一般数组指针用在什么地方呢,如下
int arr[3][5] = { ....... };
给一个函数传参 fun(arr); 
那形参怎么写呢
注意,此时这是二维数组,arr表示的是首行的地址,相当于一整个一维数组的地址
而不是首元素地址
1. int arr[3][5] 写数组形式
2. int (*arr)[5] 写数组指针形式  此时arr表示第一行地址arr+1表示第二行地址
*(p+i) 相当于第i行的首元素地址 *(*(p+i)+j) 表示arr[i][j]元素 直接p[i][j]也表示元素

3.

//C语言实现数据结构,必须学会以下
// 指针 结构体 动态内存管理 这三样 才能听懂数据结构

%p 打印地址用的格式字符转换
//数组名通常表示首元素地址 但是2个例外
1.sizeof(单独一个数组名) arr+0不算 //这里表整个数组
2.&数组名 //也表示整个数组的地址

4.

sizeof是操作符
strlen是库函数

5.

int a[] = { 1,2,3,4 };
sizeof(单独数组名)此时数组名表示整个元素,不是首元素地址
sizeof(a) 16 4 * 4个字节
sizeof(a + 0) 4 / 8 不是单独数组名,变首元素地址 + 0 = 首元素地址,是个地址,指针,4 / 8字节
sizeof(*a) 4 首元素大小
sizeof(a + 1) 4 / 8 地址 / 指针
sizeof(a[1]) 4 第二个元素大小
sizeof(&a) 4 / 8 & a取a的地址,也是个地址指针
sizeof(*&a) 16 可以理解为 * 和 & 互相抵消了,也可以理解 & a得到整个数组地址, *&a解引用则得到整个数组
sizeof(&a + 1) 4 / 8 还是地址
sizeof(&a[0]) 4 / 8 还是地址
sizeof(&a[0] + 1) 4 / 8 还是地址

6.

char arr[] = { 'a','b','c','d','e','f' } 注意里面没放\0
sizeof(arr) 6
sizeof(arr + 0) 4 / 8 指针地址
sizeof(*arr) 1 首元素大小
sizeof(arr[1]) 1
sizeof(&arr) 4 / 8
sizeof(&arr + 1) 4 / 8
sizeof(&arr[0] + 1) 4 / 8

char arr[] = "abcdef"
sizeof(arr) 7
sizeof(arr + 0) 4 / 8 指针地址
sizeof(*arr) 1 首元素大小
sizeof(arr[1]) 1
sizeof(&arr) 4 / 8
sizeof(&arr + 1) 4 / 8
sizeof(&arr[0] + 1) 4 / 8

7.

char arr[] = { 'a','b','c','d','e','f' } 注意里面没放\0
strlen(里面的参数是地址)
strlen(arr) 随机值
strlen(arr + 0) 随机值
strlen(*arr) 错误, 野指针
strlen(arr[1]) 错误
strlen(&arr) 随机值
strlen(&arr + 1) 随机值 - 6
strlen(&arr[0] + 1) 随机值 - 1

char arr[] = "abcdef"
strlen(arr) 6
strlen(arr + 0) 6
strlen(*arr) 错误, 野指针
strlen(arr[1]) 错误
strlen(&arr) 6
strlen(&arr + 1) 随机值 & arr + 1跳过整个数组,包括\0 导致strlen找不到\0
strlen(&arr[0] + 1) 5

8.

char* p = "abcdef" 这种是常量字符串 p存的首元素地址
sizeof(p) 4 / 8
sizeof(p + 1) 4 / 8
sizeof(*p) 1
sizeof(p[0]) 1
sizeof(&p) 4 / 8
sizeof(&p + 1) 4 / 8
sizeof(&p[0] + 1) 4 / 8
strlen(p) 6
strlen(p + 1) 5
strlen(*p) 错误
strlen(p[0]) 错误
strlen(&p) 随机值
strlen(&p + 1) 随机值
strlen(&p[0] + 1) 5

9.

struct test
{
	此结构体变量大小20字节
}*p;
p = 0x 100000
printf("%p",p+1) 100001
printf("%p", (unsigned long)p + 1) 10000016进制数变无符号整数得1048576 +1 = 1048577    0x100001
printf("%p", (unsigned int*)p + 1) 0x100000+4 = 0x100004 


int a[3][2]={(0,1),(1,2),(3,4)}
注意里面是括号,所以是逗号表达式,初始化其实是 1,2,4,0,0,0
正确应该是{ {},{},{} }

C语言学习日志

时间:2024/9/27 21:14分

目标:一个月学完c语言

每天更新,不断更 

倒计时:16天

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值