20240320,指针和CONST,指针运算,*P++,malloc-free

文章详细介绍了C语言中指针的基础概念,包括指针与CONST的关系、指针运算、动态内存分配(malloc和free)以及水仙花数的查找。作者还探讨了指针类型转换和内存管理的最佳实践。
摘要由CSDN通过智能技术生成

目录

零,水仙花数

一,指针

1.1 指针和CONST

1.1.1 指针是CONST

1.1.2 所指是CONST

1.1.3 判断

1.1.4 转换

1.1.5 const指针

1.2 指针运算

1.2.1 *P++

1.2.2 指针比较

1.2.3 0地址-没懂

1.2.4 指针类型转换

1.3 动态内存分配

 1.3.1 FREE

零,水仙花数

今天想做点两道垃圾题就摆烂的,结果……呵呵呵我才是垃圾是吧
求 100~999 之间的水仙花数。所谓水仙花数,是指一个3位数,它的每位数字的立方之和等于该数。例如,因为 153-=1+5+3,所以 153 为水仙花数。

#include<stdio.h>
#include<math.h>
int main() {
	const int s = 100;
	int a[10] = { 0 };
	int i;
	int t = 0;
	int ge, shi, bai;
	for (i = 150; i < 200; i++) {
		ge = i % 10;
		bai = i / 100;
		shi = (i / 10) % 10;
		int hehe = ge * ge * ge + shi * shi * shi + bai * bai * bai;
		printf("%d %d %d=%d\n", ge, shi, bai, hehe);
		if (hehe == i) {
			int t = 0;
			a[t] == i;//这一步没有起作用,但是也没有报错,到底是为什么
			t++;
		}
	}
	int c;
	for (c = 0; c < s; c++) {
		printf("a[%d]=%d\t", c, a[c]);
		if ((c + 1) % 5 == 0) {
			printf("\n");
		}
	}
	return 0;
}

为什么!!!!为什么给数组的赋值失败了!!!,为什么!
虽然另一种数组方式出来了,但是我真的很气!!!

#include<stdio.h>
int main() {
	const int s = 1000;
	int a[1000] = { 0 };
	int i;
	for (i = 0; i < s; i++) {
		a[i] = 0;
	}
	i = 100;
	for (i = 100; i < s; i++) {
		int ge = i % 10;
		int bai = i / 100;
		int shi = (i / 10) % 10;
		int hehe = ge * ge * ge + shi * shi * shi + bai * bai * bai;
		if (hehe == i) {
			a[i] = 1;
			printf("%d\t", i);
		}
	}
	printf("\n");
	return 0;
}

一,指针

1.1 指针和CONST

1.1.1 指针是CONST
int* const q == &i;
//q是const,Q的值不能改变,不能指向其他变量
*q=26//OK,访问I,I可以改变
q++//不行,Q的值不能变
1.1.2 所指是CONST

不能通过指针去修改那个变量

const int* p = &i;
i++//可以,I可以变
*p=&y//可以,P可以指向别的变量
*p=26//不行,不可以通过*p对I进行修改
1.1.3 判断

CONST在*号前面还是后面,后面指针不能被修改,前面不能通过指针去修改

int i;
const int* p = &i;
int const* p = &p1;
//const在*前,所指不能被修改
int* const p = &p2;
//后面,P是常量,不能修改
1.1.4 转换

没懂,只懂了一句可以避免函数对指针的修改

1.1.5 const指针

数组a[ ]可以看作一种CONST的指针,A-->【】,给数组CONST,就是数组的每一个变量都是CONST INT .因为传入函数的数组是指针,所以可以直接修改,为了保护数组,可以CONST A[  ]

1.2 指针运算

	int i;
	int *p=&i;
	printf("%p\n",p);
	printf("%p\n",p+1);
	char t;
	char*q=&t;
	printf("%p\n",1);
	printf("%p\n",1+1);
	sizeof(char)==1
	sizeof(int)==4
int a[]={5,45,3,4,54,32,534,2,}
int* p = a;
*p==a[0]
*(p + 2)-- > a[2];

 指针的加减就是向前向后移动几个单元,

int i[]={2,34,21,2,4,56,7,23,2,4,3,};
	int *p=i;
	int *p1=&i[5];
	printf("%p\n",p);
	printf("%p\n",p+1);
	printf("p1-p=%d",p1-p);
	char t[]={4,56,3,5,4,3,2,2,};
	char*q=&t[4];
	char*q1=&t[7];
	printf("%p\n",1);
	printf("%p\n",1+1);
	printf("q1-q=%d",q1-q);
	//sizeof(char)==1
	//sizeof(int)==4

两个指针相减,结果是地址的差/sizeof(),两个地址之间有几个这样类型的东西在中间

1.2.1 *P++

++的优先级更高,取出P指向的变量,再把P该为指向相邻的下一个变量,非常适合用来做遍历

	int i[]={2,34,21,2,4,56,7,23,2,4,3,-1};
	int *p=i;
	while(*p!=-1){
		printf("%d\t",*p++);
	}
1.2.2 指针比较

<,>,<=,>=,==,!=,比较内存中的地址

1.2.3 0地址-没懂

1.2.4 指针类型转换

指针不能相互赋值,避免用错,INT类型的指针赋值给CHAR类型的指针,范围变大了???

 往往用在底层空间里面,要直接访问一些外部设备?外部寄存器……

这部分都稍微抽象了一点,笑死

1.3 动态内存分配

又来了,照着写但是跑不出来

#include<stdio.h>
#include<stdlib.h>
int main() {
	int number;
	int *a;
	printf("输入数量");
	scanf("%d",&number);
	a=(int*)malloc(number*sizeof(int));
	//malloc要的参数不是占据多少个单元,而是占据多少个字节
	//number X sizeof() 
	//malloc的结果是VOID,要类型转换一下
	//之后可以把A当作数组
	int i=0;
	for(i=0;i<number;i++){
		scanf("%d",a[i]);
	} 
	for(i=number-1;i>=0;i--){
		printf("%d ",a[i]);
	}
	free(a);//借到的内存要还回去 
return 0;
}

不是很懂

#include<stdio.h>
#include<stdlib.h>
int main() {
	void *p;
	int cnt=0;
	while (p=malloc(100*1024*1024) ){
		cnt++;
	}//把MALLOC的结果给P,同时作为判断的条件,要是不是0,…… 
	printf("分配了%d00MB空间\n",cnt); 
	//12300
	free(p);
	return 0;
}
 1.3.1 FREE
#include<stdio.h>
#include<stdlib.h>
int main() {
	void *p;
	int cnt=0;
	while (p=malloc(100*1024*1024) ){
		cnt++;
	}//把MALLOC的结果给P,同时作为判断的条件,要是不是0,…… 
	printf("分配了%d00MB空间\n",cnt); 
	//12300
	P++;
	free(p);
	return 0;
}

只能还申请来的空间的首地址

#include<stdio.h>
#include<stdlib.h>
int main() {
	int i;
	void* p;
	p = &i;
	free(p);
	return 0;
}
#include<stdio.h>
#include<stdlib.h>
int main() {
	int i;
	void* p=0;
	p = &i;
	free(NULL);
	return 0;
}

反正0不是有效的地址,看见0就不做什么了?写代码的良好习惯?*P初始为0?
如果最后没有MALLOC,那么FREE(0),不会出错?

申请的内存时有限的,新手——忘了FREE,老手(不够老的老手)——找不到合适的时机?FREE过了,又FREE一次?

一,写MALLOC就FREE,二,程序架构有良好的设计,地址变过了直接FREE?三经验,

丢这都是什么东西

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值