目录
一、数组
1.数组内存在预处理阶段已经分配好,变量编译阶段分配不行
宏替换 #define MAX_SIZE 1024 int a[MAX_SIZE] 可以
变量 int MAX_SIZE = 1024; int a[MAX_SIZE] 不可以
2.strcpy(stu.name , "数组整体操作赋值用strcpy");
|%-10s|id|%d|age|%d|sex|%c|\n //数据库形式输出
3.数组首元素地址 a = &a[0] 第二个元素地址 a + 1 = &a[1]
数组地址 &a 超出数组空间 &a + 1
4. printf("整个数组的大小:%d\n",sizeof(a))
printf("a[0]的大小:%d\n",sizeof(*a))
printf("指针的内存大小:%d\n",sizeof(a))
二、指针
1.数组指针:int (*a)[10]
函数指针:void (*fun) (int, int)
指针函数:int* fun() //函数返回指针,指针指向的不能是局部变量
2.数组和指针的联系
1、数组名可以当成指针使用
2、a:数组首元素的地址 a = &a[0] a + 1 = &a[1]
&a &a + 1
3.数组作为函数参数被传递是,数组名会被弱化为指针
//main() { printf(sizeof(a)) } 输出:整个数组大小
//func(int a[]) { printf(sizeof(a)) } 输出:指针大小 8
3. 指针大小: 8字节占满计算机计算位数
1)32位地址总线4B 64位地址总线8B(地址总线,数据总线,控制总线)
2)但内存可扩充可虚拟化所以一律按8B
4. 内存泄漏:malloc没有free释放堆空间 new(C++)
三、代码练习
1.两数交换
#include<stdio.h>
int main()
{
int a = 3, b = 4;
//中间变量法,空间换时间
int temp = a;
a = b;
b = temp;
printf("中间变量法:a = %d,b = %d\n",a,b);
//数轴法/算术法,
//加法可能上溢出
//减法可能下溢出
a = a + b;
b = a - b;
a = a - b;
printf("加法式:a = %d,b = %d\n",a,b);
//位操作发,不会溢出
//异或操作
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("位操作法:a = %d,b = %d\n",a,b);
return 0;
}
2.代码实际五大内存分配位置
//main.cpp
int a = 0; //全局初始化区
char *p1; //全局未初始化区
void main()
{
int b; //栈
char s[] = "abc";// 栈
char *p2;// 栈
char *p3 = "123456";// 123456\0在常量区,p3在栈上。
static int c =0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
3.输入10a10 输出:?
#include<stdio.h>
int main()
{
int a = 1, b = 3;
char c[10] = {0};
scanf("%d%s%d",&a, c, &b); //输入10a10 输出:?
printf("%d\n", a); //10
printf("%d\n", b); //未知,因为a是10 c是a10 还要再输入一个数
printf("%s\n", c); //a10
return 0;
}
4.判断大小端存储
#include<stdio.h>
union demo
{
int a;
char ch[4];
};
int main()
{
union demo d;
d.a = 0x12345678;
int i;
for (i = 0; i < 4; i++)
{
printf("%x\n",d.ch[i]);
}
return 0;
}
5.char c = 0 和 char c = '0' 是不一样滴
#include<stdio.h>
#include<string.h>
int main()
{
char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
//printf("%4d",a[i]);
}
printf("%ld\n",strlen(a)); //输出255,这里0不是'0',转换为ASCII就是'\0' ,就是NULL
return 0;
}
6.在x86系统下,其值为多少? 输出;2019 2017
#include<stdio.h>
int main()
{
int a[4] = {2016,2017,2018,2019};
int *ptr1 = (int *)(&a + 1);
int *ptr2 = (int *)((int)a + 1); //windows下地址转不成数,当题看
printf("%x, %x",ptr1[-1],*ptr2); //2019, 2017
return 0;
}
三、杂谈
1.虚拟机回环网络解决:执行: dhclient -v
2.find结果传给wc 显示当前目录下.c文件数
find . - name "*.c" | wc -l
3.小心中英文空格
4.%p地址输出符 %x转换为16进制
5.待看:makefile默认规则,git是啥