指针的内存分配:
当指针没有被初定义的时候,其没有指向确切的内存。此时用strcpy向str1所指向的内存
中拷贝内容将出错。利用malloc动态分配指向的内存(在堆中):
poem[n]=(char*)malloc(sizeof (char)*(strlen(str)+1));//进行动态分布空间
用完后必须用free释放内存空间。这与在栈中自动分配的内存不同,栈中的内存在函数结束后自动释放。
初定义为指针数组分配了空间:
int *p;
令p="sssss"; 等价于
char a[10]="sssss";//为a初定义分配的空间;
p=a;
此时p与a指向的是同一片空间;
而sizeof(p,a)此时只是把a空间上的值复制到p所指的空间里,但a和p所指向的为两片不同的空间。则,一旦当p明确了其指向的空间时,我们可以将值赋给所对应的内存单元,
对于数组名,其地址值已经确定,便为常量,是不可以更改的;
例如:字符数组中str表示数组的首地址是一个常量,str等于一个固定的内存地址,所
以永远不能在等号左边被赋值(除了声明变量初始化时,char str[10]="sssssss"),
但数组变量是可以更改的;内存的地址是固定的,而地址所指向的内存中的内容是变化的。
藏头诗解译代码:
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
int main (void )
{
int i,n=0;
char *poem[20],str[80],mean[20];
gets(str);
while (str[0]!='#')
{
poem[n]=(char*)malloc(sizeof (char)*(strlen(str)+1));//进行动态分布空间
strcpy(poem[n],str);
n++;
gets(str);
}
for(i=0;i<n;i++)
{
mean[i]=*poem[i];//取出每个空间的第一个字符
free(poem[i]);
}
mean[i]='\0'; //结束标志
puts(mean);
return 0;
}
纸牌分发:
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
struct card{
int suit;
int fact;
};
void deal (struct card *wdeck)
{
int i,m,t;
static int temp[52]={0};
srand(time(NULL));
for(i=0;i<52;i++)
{
while (1)
{
m=rand()%52;
if(temp[m]==0)
{
break;
}
}
temp[m]=1;
t=(i%4)*13+(i/14);
wdeck [t].suit=m/13;
wdeck [t].fact=m%13;
}
}
int main(void )
{
int i;
struct card deck[52];
const char *suit[]={"Heart","Diamond","Club","Spade"};
const char *face[]={"A","K","Q","J","10","9","8","7","6","5","4","3","2"};
deal(deck);
for(i=0;i<52;i++)
{
if(i%13==0)
{
printf("Player %d :\n",i/13+1);
}
printf("%s of %s \n",face[deck[i].fact],suit[deck[i].suit]);
}
return 0;
}