目录
零,水仙花数
今天想做点两道垃圾题就摆烂的,结果……呵呵呵我才是垃圾是吧
求 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?三经验,
丢这都是什么东西