C---------------LessonDynamicMemory
来源:互联网 发布:说明书排版设计软件 编辑:程序博客网 时间:2024/06/01 08:20
#import <Foundation/Foundation.h>
//定义宏:三部分: 1.#define 2.宏名 3.替换的内容
//宏的作用: 只做替换.
//宏名的命名规范:1.全部大写. 2.k + 驼峰(kNumberArray)
//无参宏
#define NUMBER 6
//有参宏
//宏应该注意的几个问题:
//1.宏名大写.
//2.参数一定要加小括号.
//3.宏替换的内容不要加分号.
//4.对于有参宏,宏名和参数之间不要加空格.
#define MUL(A, B) ((A) * (B))
/**
* 内存存储区的划分
1.栈区:栈区主要存放函数内部定义的变量数组,函数调用时开辟空间,函数执行完毕回收空间,空间的开辟与回收由系统管理.
2.堆区:堆区的最大特点,空间的开辟与释放由开发人员手动管理.
3.全局区静态区:主要存放函数外部定义的全局变量以及静态变量,空间一旦开辟,就不会回收,直到应用程序执行结束.
4.常量区:存储常量:1.整型常量 2.浮点型常量 3.字符常量 4.字符串常量
5.代码区:存放程序编译之后生产的CPU指令.
*/
//交换两个变量的值
void swap(int *p, int *q);
void swap(int *p, int *q)
{
int temp = *p;
*p = *q;
*q = temp;
}
//函数内部有一个数组存储字符串,返回字符窜的首地址
char *getString();
char *getString()
{
//Address of stack memory associated with local variable 'str' returned
//reason:局部变量的空间被返回,函数执行完毕之后,局部变量空间已经被系统回收.
//solution:返回一个不被回收的空间.
static char str[] ="iPhone";
return str;
//local 局部的
//global 全局的
}
int main(int argc, const char * argv[])
{
//交换两个变量的值
/*
int a = 10, b = 5;
swap(&a, &b);
printf("a = %d, b = %d\n", a, b);
*/
//在堆区开辟空间
//void * 泛型,可以代表所有的指针类型.
//自己根据空间上要存储的数据转一下类型即可
//如果要存储两个整数,用int *,存储8个字符,用char *,存储4个整数,用short *.
//malloc 在堆区开辟N个字节大小的空间,返回空间首地址.
/*
char *p = malloc(8);
//存储iPhone.
strcpy(p, "iPhone");
printf("%s\n", p);
//释放空间
//删除只是标记删除,不会清除空间上的内容.
free(p);
p = NULL;//重新指向一块无效的区域.
// free(p);
*/
/**
* 堆区空间的问题:
1.野指针的问题:访问没有所有权的内存空间.
2.过度释放:一块空间释放多次,程序会立即crash.
3.内存泄漏:空间没有释放,造成内存堆积.不会造成立即crash,安全隐患.
*/
// printf("%s\n", p);
/*
//1.申请一个有5个元素的数组空间,存储5个整数.
int *p = malloc(5 * sizeof(int));
for (int i = 0; i < 5; i++) {
*(p + i) = arc4random() % (60 - 20 + 1) + 20;
printf("%d ", *(p + i));
}
printf("\n");
//2.升序排序
for (int i = 0; i < 5 - 1; i++) {
for (int j = 0; j < 5 - 1 - i; j++) {
if (*(p + j) > *(p + j + 1)) {
int temp = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = temp;
}
}
}
//3.输出
for (int i = 0; i < 5; i++) {
printf("%d ", *(p + i));
}
free(p);
p = NULL; //重新指向一块无效的空间.
*/
/**
* 使用指针必备条件:
1.指针要有明确指向.
2.指向一个可控的区域.
*/
/*
int *p = NULL;
*p = 20;
*/
//有一字符串,其中包含数字,提取其中的数字,要求动态分配内存保存
//提示:先计算出有几个数字,然后根据数字的个数来开辟空间.
/*
char str[] = "lkajkj535kjfakj2452kjjkl";
int count = 0;
int i = 0;
while (str[i] != '\0') {
if (str[i] >= '0' && str[i] <= '9') {
count++;
}
i++;
}
char *p = malloc(count + 1);
i = 0;
int j = 0;
while (str[i] != '\0') {
if (str[i] >= '0' && str[i] <= '9') {
*(p + j++) = str[i];
}
i++;
}
*(p + j) = '\0';
printf("%s\n", p);
free(p);
p = NULL;
*/
/*
char str[] = "4435fggg5fasd";
int count = 0;
int i = 0;
while (str[i] != '\0') {
if (str[i] >= '0' && str[i] <= '9') {
count++;
}
i++;
}
char *p = malloc(count + 1);
i = 0;
int j = 0;
while (str[i] != '\0') {
if (str[i] >= '0' && str[i] <= '9') {
*(p + j++) = str[i];
}
i++;
}
*(p + j) = '\0';
printf("%s\n", p);
free(p);
p = NULL;
*/
//输入3个学员的姓名,动态分配内存保存学员姓名,并在最后输出
//提示:定义一个指针数组保存数据char *names[3] = {0};
//1.如何存储从控制台输入的字符串.
/*
char *names[3] = {0};
char temp[100] = {0};
for (int i = 0; i < 3; i++) {
printf("输入姓名:");
scanf("%s", temp);
names[i] = malloc(strlen(temp) + 1);
strcpy(names[i], temp);
}
for (int i = 0; i < 3; i++) {
printf("%s\n", names[i]);
free(names[i]);
names[i] = NULL;
}
*/
//简单思考的习惯:将任务划分为一个一个单一的任务,逐一完成.
//其他的内存分配函数
//void * calloc(unsigned n, unsigned size);
//分配n个size大小的空间,并且把该内存上的所有字节清零.
/*
int *p = calloc(5, 4);
free(p);
p = NULL;
*/
//void *realloc(void *p, unsigned size);
//按给定的地址开始,重新分配size大小的空间.
/*
int *p = malloc(10);
//返回值,返回当前空间的首地址,如果当前空间不够,则在另一块空间上申请20个字节的空间,此时返回新的空间地址.
printf("%p\n", p);
int *p1 = realloc(p, 20);
printf("%p\n", p1);
free(p1);
p1 = NULL;
p = NULL;
*/
//其他内存操作函数
// void *memcpy(void *dest, const void *source, size_t n)
//从source指向的内存开始拷⻉到dest,拷⻉n个字节
// char *p1 = malloc(8);
// //将空间清零
// memset(p1, 0, 8);
// char *p2 = malloc(8);
// memset(p2, 0, 8);
// strcpy(p2, "Frank");
// printf("%s\n", p2);
/*
memcpy(p1, p2 + 4, 4);
// *(p1 + 4) = '\0';
printf("%s\n", p1);
*/
// void *memset(void *s , int c , size_t n)
//从s指向的内存开始初始化n个字节的内容为c
// int memcmp(const void *buf1, const void*buf2, unsigned int count)
// ⽐较buf1和buf2指向的内存是否相同,⽐较count个字节
// 定义两个整型指针,分别⽤malloc、calloc对其分配空间保存3个元
// 素,malloc分配的空间⽤memset清零,随机对数组进⾏赋值随机范
// 围1-3,赋值后⽤memcmp⽐较两个数组。如果相同打印Good!否则
// 打印Failed...
/*
int *p1 = malloc(3 * sizeof(int));
int *p2 = calloc(3, sizeof(int));
for (int i = 0; i < 3; i++) {
*(p1 + i) = arc4random() % 4;
*(p2 + i) = arc4random() % 4;
printf("p1 = %d, p2 = %d\n", *(p1 + i), *(p2 + i));
}
if (memcmp(p1, p2, 3 * sizeof(int)) == 0) {
printf("Good!");
}
free(p1);
free(p2);
p1 = NULL;
p2 = NULL;
*/
int a[NUMBER] = {0};
for (int i = 0; i < NUMBER; i++) {
a[i] = arc4random() % (60 -20 + 1) + 20;
printf("%d ", a[i]);
}
printf("\n");
for (int i = 0; i < NUMBER - 1; i++) {
for (int j =0; j < NUMBER - 1 - i; j++) {
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for (int i = 0; i < NUMBER; i++) {
printf("%d ", a[i]);
} //3 + 4 * 2 + 3
int data = MUL(3 +4, 2 + 3);
printf("\ndata = %d\n", data);
return 0;
}
- C---------------LessonDynamicMemory
- c
- c
- c
- c
- C
- c
- c
- c
- C+
- c
- C
- c
- c
- c
- C
- C
- c
- 关于系统的SignalR的即时通讯功能
- zjut_1178 最小公倍数
- C----------------LessonPointerHigher
- python里面的一些小知识点
- 2015 4399校园招聘游戏开发笔试题
- C---------------LessonDynamicMemory
- C++ vector 的resize和reverve
- Linux core 文件
- HDU--1029--Ignatius and the Princess IV
- 手斧Linux – 从LFS到Funtoo (1)
- 冒泡排序
- 一元二次函数
- 弄明白ThreadLocal类
- C----------------LessonDynamicSort