C记录
- 1.内存管理
- 2. 结构体内存对其规则
- 3. 字符串函数
- 4. 二维数组
- 5. const 指针
- 6. 字符串
- 7. 图片记录
- 8. 函数指针
1.内存管理
C语言内存讲解-详说内存分布和heap空间
2. 结构体内存对其规则
C语言结构体对齐规则
C语言-结构体 字节对齐–嵌套–数组
10道经典例题手撕C语言字节问题
#pragma pack(N) 每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
如果没有通过宏,那么在32位Linux主机上默认指定对齐值为4,64位的默认对齐值为8,AMR CPU默认指定对齐值为8;
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "abcd";
char str2[] = {'a','b','c','d','\0'};
char *str3 = "abcd";
char week[3][10] = {
"Monday",
"Thenday",
"Wenday"
};
char *pweek[]{
"Monday",
"Thenday",
"Wenday"
};
int a[] = {1,2,3,4,5,6};
int *p = a;
printf("%d\n",*(p+1));
int x = 1, y = 2, z = 3;
int* b[3] = { &x,&y,&z };
int** pb = b;
for (int i = 0; i < 3; i++) {
printf("%d\n", **(b + i));
}
for (int i = 0; i < 3; i++) {
printf("%d\n", *(pb[i]));
}
int array[3][4]={
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
int (*pa)[4] = array;
/而pa[0]+1 不等于 pa+1
for (int i = 0;i < 3;i++){
for (int j = 0; j < 4; j++){
printf("%d ",*(*(pa+i)+j));
}
printf("\n");
}
for (int i = 0;i < 3;i++){
for (int j = 0; j < 4; j++){
printf("%d ",*(array[i]+j));
}
printf("\n");
}
return 0;
}
3. 字符串函数
复制字符串
strcpy(str1,str2) str1的位置必须够,但是不检查是否位置够
strncpy(str1,str2,n) 按照n的个数复制字符 该函数不会自己添加’\0’ 如果没有的话,需要自己添加
拼接字符串
strcat(str1,str2) str1的位置必须够,但是不检查是否位置够 该函数不会自己添加’\0’
strncat(str1,str2,n) 按照n的个数拼接字符 该函数自动添加空字符\0
strncat(
str1,
str2,
sizeof(str1) - strlen(str1) - 1
);
比较字符
strcmp(str1,str2)
strncmp(str1,str2,n)
字符串拼接
sprintf(),snprintf()
char first[6] = "hello";
char last[6] = "world";
char s[40];
sprintf(s, "%s %s", first, last);
4. 二维数组
#include<stdio.h>
int main(void)
{
int array[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
for (int i = 0; i < 3; i++)
{
printf("%d %d %d %d\n", array[i][0], array[i][1], array[i][2], array[i][3]);
}
for (int i = 0; i < 3; i++)
{
printf("%p %p %p %p\n", &array[i][0], &array[i][1], &array[i][2], &array[i][3]);
}
printf("在理解的时候,[ ]就相当于*解引用;若有[ ]又有&就相当于这两个都没有\n");
printf("二维数组名字直接使用表示数组指针 若解一层引用表示到具体的某一行数组名\n");
printf("array: %p *array: %p\n", array, *array);
printf("array + 1: %p *array + 1: %p\n", array + 1, *array + 1);
printf("&array[0]: %p array[0]: %p\n", &array[0], array[0]);
printf("&array[0] + 1:%p array[0] + 1:%p\n", &array[0] + 1, array[0] + 1);
int(*p1)[4];
int(*p2)[4];
int(*p3)[4];
p1 = array;
p2 = *array;
p3 = array[0];
printf("%p %p %p\n", p1 + 1, p2 + 1, p3 + 1);
printf("%p %p %p\n", *(p1 + 1) + 2, *(p2 + 1) + 2, *(p3 + 1) + 2);
int(*p4)[4];
p4 = array[0] + 1;
printf("%p\n", p4 + 1);
p4 = array + 1;
printf("%p\n", *p4 + 1);
return 0;
}
5. const 指针
![在这里插入图片描述](https://img-blog.csdnimg.cn/cc47a68e1d3a478dab3f314d710ecbe2.png#pic_center)
6. 字符串
#define DMG "I am ueueq"
int main(void)
{
char str1[] = { 'A','B','C','D','E','\0' };
char str2[] = "ABCDE";
char* str3 = "ABCDE";
printf("strlen:%d sizeof:%d\n", strlen(str1), sizeof(str1));
printf("strlen:%d sizeof:%d\n", strlen(str2), sizeof(str2));
printf("str2:%p *str3%p\n", str2, str3);
str1[1] = 'Z';
str2[1] = 'Z';
puts(str1);
puts(str2);
puts(str3);
char str[] = DMG;
char* strp = DMG;
printf("str[]:%p *strp:%p\n", str, strp);
printf("DMG:%p\n", DMG);
const int* pt;
int const* pz;
int* const pl;
return 0;
}
7. 图片记录
![在这里插入图片描述](https://img-blog.csdnimg.cn/8d259a14dc554011b3f4ee472cfa66f0.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/0258d3820b7a4976aef73235d90d9ce3.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/ee89b4316c27487d967416bbcb8c06fc.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/faf87e7576754f3d8c4535078dcd93ab.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/9db608f49c6b4dd09d146083f776b651.png#pic_center)
8. 函数指针
void func(int a, int b);
void (*pf)(int, int);
pf = func;
pf(1, 2);
int func(char*, int);
int (*pf)(char*, int);
pf = func;
pf('0', 1);
int func(char*);
int (*pf[10])(char*);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)