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

目录

零,水仙花数

一,指针

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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值