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);
}
第一次寫博客,感覺怪怪的,希望各位親見諒。本學渣會加油的!!!