1.const和define的区别:
1->const在编译阶段用,define在预处理阶段才替换
2->const检查类型,const int i=3.5,这就是错的;define不检查类型,只完成普通的替换
3->const常量会在内存中分配,而define则不会。
2.指针变量在内存中的字节大小:
大小根本取决于cpu当下的寻址能力,在vc6.0下这个和你的cpu,操作系统和编译器都有关占,领导如下:cpu>操作系统>编译器,如果cpu是32位,那么操作系统只能是32位,编译器只能是16位或者32,如果编译器32位,这时候寻址能力是4字节,如果编译器16位,这时候寻址能力2字节,总之,一层一层是有限制关系的,你需要看具体情况。嘿嘿!希望我表达清楚了。
3.sizeof()和strlen()区别:
如果是sizeof(),他计算的是这段空间所用的内存字节,而strlen()算的是有效字节是多少。举个栗子:
char a[20]="xiaoxiaoxuezha";
sizeof(a)是实际上开辟了20字节给它,因此sizeof(a)=20;
strlen(a)是有效字节,而且不算'\0',因此是strlen(a)=14;
4.看错误:
char *a[]={"I","am","xuezha"};
char *t[]=a+1;
分析以下数组a,数组a 中有三个元素,这三个元素存放的内容是指针,这三个指针分别指向以上三个字符串首地址,
a+0是a第一个元素的首地址,a+1是a第二个元素的首地址。因此第一种改的方案*t[]={a+1};当你定义一个数组时,t[]代表他的首地址是常量,常量不能被另一个常量赋值,因此也是错。改的方法:char **t=a+1;
5.有没有发现啥奇怪的地方,这个知识点我现在说的不全,不过我会进步滴!
int v0=3;
int v1[2]={1,2};
int v2;
void func(void )
{
int i,v3=3;
static int v4=7;
int sum=0;
v4=v4>>1;
sun=v0+v1[1]+v1[2]+v2+v3+v4;
for(i=0;i<sun;i++)
printf("啦啦啦");
}
解释:全局变量静态变量会放在内存的全局数据段,动态开辟内存的数据会在堆,而其他的(包括形参)放在堆栈,在全局数据段中,初始化的放一起,没初始化的放一起,因此才有了v1[2]和v4共享一段内存!
6.实现一个函数,找出现字符最少的字符
char c[10]={'a','b','c','c','a','a','d','d','a','e','a'};
#include <stdio.h>
#include <string.h>
void suan(char c[],int a)
{
int t[26]={0};
int i,j,k;
int d;
for(i=0;i<a;i++)
t[(int)(c[i]-'a')]++;
d=t[0];
for(i=0;i<26;i++)
{
if((d>t[i])&&(t[i]!=0))
d=t[i];
}
for(i=0;i<26;i++)
if(d==t[i])
printf("%c\n",(char)(i+97));
}
7.小朋友传糖,n个小孩子,每人手里几个气球,现在要他们传气球,只能他传给和他相邻的人(两个人之间不管传了几个,只算一次),而且,排头只能传给第二个,排尾只能传给前一个,求传球的次数和最小是多少?
#include <stdio.h>
#include <stdlib.h>
void main()
{
int i,j;
int n,*p;
int add=0,ci=0;
printf("输入小朋友的人数:\n");
scanf("%d",&n);
p=(int*)malloc(sizeof(int)*n);
printf("你需要输入%d个小朋友的糖果数目 : \n",n);
for(i=0;i<n;i++)
scanf("%d",p+i);
printf("counting!!!!!\n");
for(j=0;j<n;j++)
{
add=add+(*(p+i));
}
add=add/n;
for(j=0;j<n;j++)
{
int sub;
sub=add-p[j];
if(j==n-1)
break;
if((sub!=0)||(p[j]!=add))
{
ci++;
p[j+1] = p[j+1] - sub;
p[j] = p[j] + sub;
}
}
printf("需要%d次!!!\n",ci);
}
第一次写博客,感觉怪怪的,希望各位亲见谅。本学渣会加油的!!!