??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品无码国产片,亚洲国产精品自在拍在线播放,亚洲高清免费视频http://m.tkk7.com/badboyryan/articles/70280.html谈笑有`?/dc:creator>谈笑有`?/author>Mon, 18 Sep 2006 06:34:00 GMThttp://m.tkk7.com/badboyryan/articles/70280.htmlhttp://m.tkk7.com/badboyryan/comments/70280.htmlhttp://m.tkk7.com/badboyryan/articles/70280.html#Feedback0http://m.tkk7.com/badboyryan/comments/commentRss/70280.htmlhttp://m.tkk7.com/badboyryan/services/trackbacks/70280.html  c语言隄(我{?
 

q篇文章主要是介l一些在复习C语言的过E中W者个为比较重点的地方Q较好的掌握q些重点会对C的运用更加得 心应手。此外会包括一些细节、易错的地方。涉及的主要内容包括Q变量的作用域和存储cd、函数、数l、字W串、指针、文件、链表等。一些最基本的概念在?׃多作解释了,仅希望能有只a片语l同是C语言初学者的学习和上E提供一点点的帮助?

变量作用域和存储cdQ?/strong>

了解了基本的变量cd后,我们要进一步了解它的存储类别和变量作用域问题?/font>

变量cd子类?/font>
局部变?/font>静态变量(d函数Q变量g保留Q?/font>
自动变量
寄存器变?/font>
全局变量静态变量(只能在本文g中用Q?/font>
非静态变量(允许其他文g使用Q?/font>

换一个角?/font>

变量cd子类?/font>
静态存储变?静态局部变量(函数Q?
静态全局变量Q本文gQ?
非静态全局/外部变量Q其他文件引用)
动态存储变?/font>自动变量
寄存器变?/font>
形式参数

extern型的存储变量在处理多文g问题时常能用刎ͼ在一个文件中定义 extern型的变量卌明这个变量用的是其他文g的。顺便说一下,W者在做课设时遇到out of memory的错误,于是Ҏ(gu)做多文gQ再把它includeq来Q注意自己写?.h要用“”不?lt;>Q,能vC定的效用。static 型的在读E序写结果的试题中是个考点。多数时候整个程序会出现多个定义的变量在不同的函CQ考查在不同位|同一变量的值是多少。主要是遵@一个原则,?要本函数内没有定义的变量q全局变量Q而不是main里的Q,全局变量和局部变量重名时局部变量v作用Q当然还要注意静态与自动变量的区别?

函数Q?/strong>

对于函数最基本的理解是从那个叫main的单词开始的Q一开始M觉得把语句一q?写在main里不是挺好的么,Z么偏择出厅R其实这是因为对函数q不够熟l,否则函数的运用会l我们编E带来极大的便利。我们要知道函数的返回值类型, 参数的类型,以及调用函数时的形式。事先的函数说明也能起到一个提醒的好作用。所谓Ş参和实参Q即在调用函数时写在括号里的是实参Q函数本w用的就是Ş 参,在画程图时用^行四边Ş表示传参?/font>

函数的另一个应用例子就是递归了,W者开始比较头疼的问题Q反应L比较q钝Q按照老师的方法,把递归的过E耐心准确的逐d来,学习的效果还是比较好的,会觉得这U递归的运用是挺y的,事实上,著名的八皇后、汉诺塔{问题都用到了递归?/font>

例子Q?
long fun(int n)
{
long s;
if(n==1||n==2) s=2;
   else s=n-fun(n-1);
return s;
}
main()
{
printf("%ld",fun(4));
}

 

数组Q?/strong>

分ؓ一l数l和多维数组Q其存储方式Mؓ表格的话׃一目了Ӟ其实是把相同类型的变量有序的放在一赗因此,在处理比较多的数据时Q这也是大多数的情况Q数l的应用范围是非常广的?/font>

具体的实际应用不便D例,而且l大多数是与指针相结合的Q笔者个为学习数l在 更大E度上是为学习指针做一个铺垫。作为基的基要明白几U基本操作:xl赋倹{打印、排序(冒排序法和选择排序法)、查找。这些都不可避免的用?循环Q如果觉得反应不q来Q可以先一点点的把循环展开Q就会越来越熟?zhn)Q以后自q写一个功能的时候就会先扑և内在规律Q较好的q用了。另外数l做参数 Ӟ一l的[]里可以是I的Q二l的W一个[]里可以是I的但是W二个[]中必规定大?/font>

冒法排序函敎ͼ
void bubble(int a[],int n)
{
int i,j,k;
for(i=1,i<n;i++)
   for(j=0;j<n-i;j++)
   if(a[j]>a[j+1])
    {
    k=a[j];
       a[j]=a[j+1];
       a[j+1]=k;
       }
}

选择法排序函敎ͼ
void sort(int a[],int n)
{
int i,j,k,t;
for(i=0,i<n-1;i++)
   {
   k=i;
   for(j=i+1;j<n;j++)
      if(a[k]<a[j]) k=j;
      if(k!=i)
         {
         t=a[i];
         a[i]=a[k];
         a[k]=t;
         }
   }
}

折半查找函数Q原数组有序Q:
void search(int a[],int n,int x)
{
int left=0,right=n-1,mid,flag=0;
while((flag==0)&&(left<=right))
   {
   mid=(left+right)/2;
   if(x==a[mid])
      {
      printf("%d%d",x,mid);
      flag =1;
      }
      else if(x<a[mid]) right=mid-1;
                   else left=mid+1;
   }
}

相关常用的算法还?strong>判断回文Q求阶乘QFibanacci数列QQ意进制{换,杨辉三角形计?/strong>{等?/strong>

字符Ԍ

字符串其实就是一个数l(指针Q,在scanf的输入列中是不需要在前面??amp;”符LQ因为字W数l名本n即代表地址。值得注意的是字符串末‘\0’,如果没有的话Q字W串很有可能会不正常的打印。另外就是字W串 的定义和赋值问题了Q笔者有一ơ的比较l合的上Z业就是字W串打印老是qQ上上下下找了一圈问题,最后发现是因ؓ

char *name;

而不?/font>

char name[10];

前者没有说明指向哪儿,更没有确定大,D了ؕ码的错误Q印象挺深刻的?

另外Q字W串的赋g是需要注意的Q如果是用字W指针的话,既可以定义的时候赋初|?/font>

char *a="Abcdefg";

也可以在赋D句中赋|?/font>

char *a;
a="Abcdefg";

但如果是用字W数l的话,只能在定义时整体赋初|即char a[5]={"abcd"};而不能在赋D句中整体赋倹{?

常用字符串函数列表如下,要会自己实现Q?/font>

函数作用函数调用形式备注
字符串拷贝函?/font>strcpy(char*,char *)后者拷贝到前?/font>
字符串追加函?/font>strcat(char*,char *)后者追加到前者后Q返回前者,因此前者空间要_?/font>
字符串比较函?/font>strcmp(char*,char *)前者等于、小于、大于后者时Q返?、正倹{负倹{注意,不是比较长度Q是比较字符ASCII码的大小Q可用于按姓名字母排序等?/font>
字符串长?/font>strlen(char *)q回字符串的长度Q不包括'\0'.转义字符一个字W?/font>
字符串型->整型atoi(char *)
整型->字符串型itoa(int,char *,int)做课设时挺有用的
sprintf(char *,格式化输入)赋给字符Ԍ而不打印出来。课设时用也比较方便

注:对字W串是不允许?=或!=的运的Q只能用字符串比较函?

指针Q?/strong>

指针可以说是C语言中最关键的地方了Q其实这个“指针”的名字对于q个概念的理?是十分Ş象的。首先要知道Q指针变量的|x针变量中存放的|是指针(卛_址Q。指针变量定义Ş式中Q基本类?*指针变量?中的?”代表的是这是一个指向该基本cd的指针变量,而不是内容的意思。在以后使用的时候,?ptr=aӞ?”才表示ptr所指向的地址里放的内 Ҏ(gu)a?/font>

指针比较典型又简单的一应用例子是两C换,看下面的E序Q?/font>

swap(int c,int d)
{
int t;
t=c;
c=d;
d=t;
}
main()
{
int a=2,b=3;
swap(a,b);
printf(?d,%d?a,b);
}

q是不能实现a和b的数g换的Q实际上只是形参在这个函C换来换去Q对实参没什么媄响。现在,用指针类型的数据做ؓ参数的话Q更改如下:

swap(#3333FF *p1,int *p2)
{
int t;
t=*p1;
*p1=*p2;
*p2=t;
}
main()
{
int a=2,b=3;
int *ptr1,*ptr2;
ptr1=&a;
ptr2=&b;
swap(prt1,ptr2);
printf(?d,%d?a,b);
}

q样在swap中就把p1,p2 的内容给换了Q即把aQb的g换了?/font>

指针可以执行增、减q算Q结?+q算W的法则Q我们可以看?

*++s

取指针变量加1以后的内?/font>

*s++取指针变量所指内容后s再加1
(*s)++指针变量指的内容?

指针和数l?/strong>实际上几乎是一LQ数l名可以看成是一个常量指针,一l数l中ptr=&b[0]则下面的表示法是{h(hun)的:

a[3]{h(hun)?(a+3)
ptr[3]{h(hun)?(ptr+3)

下面看一个用指针来自己实现atoiQ字W串?>整型Q函敎ͼ

int atoi(char *s)
{
int sign=1,m=0;
if(*s=='+'||*s=='-') /*判断是否有符?/
sign=(*s++=='+')?1:-1; /*用到三目q算W?/
while(*s!='\0') /*Ҏ(gu)一个字W进行操?/
   {
   m=m*10+(*s-'0');
   s++; /*指向下一个字W?/
   }
return m*sign;
}

指向多维数组的指针变量也是一个比较广泛的q用。例如数la[3][4]Qa代表的实际是整个二维数组的首地址Q即W?行的首地址Q也是一个指针变量。而a+1׃是简单的在数g加上1了,它代表的不是a[0][1]Q而是W?行的首地址Q?amp;a[1][0]?/font>

指针变量常用的用途还有把指针作ؓ参数传递给其他函数Q即指向函数的指?/strong>?
看下面的几行代码Q?

void Input(ST *);
void Output(ST *);
void Bubble(ST *);
void Find(ST *);
void Failure(ST *);
/*函数声明Q这五个函数都是以一个指向ST型(事先定义q)l构的指针变量作为参敎ͼ无返回倹{?/

void (*process[5])(ST *)={Input,Output,Bubble,Find,Failure};
/*process被调用时提供5U功能不同的函数共选择(指向函数的指针数l)*/

printf("\nChoose:\n?");
scanf("%d",&choice);
if(choice>=0&&choice<=4)
(*process[choice])(a); /*调用相应的函数实C同功?;/

MQ指针的应用是非常灵zdq泛的,不是三言两语能说完的Q上面几个小例子只是个引子,实际~程中,会逐渐发现q用指针所能带来的便利和高效率?

文gQ?/strong>

函数调用形式说明
fopen("路径","打开方式")打开文g
fclose(FILE *)防止之后被误?/font>
fgetc(FILE *)从文件中d一个字W?/font>
fputc(ch,FILE *)把ch代表的字W写入这个文仉
fgets(FILE *)从文件中d一?/font>
fputs(FILE *)把一行写入文件中
fprintf(FILE *,"格式字符?,输出表列Q?/font>把数据写入文?/font>
fscanf(FILE *,"格式字符?,输入表列Q?/font>从文件中d
fwriteQ地址QsizeofQ)QnQFILE *Q?/font>把地址中n个sizeof大的数据写入文g?/font>
freadQ地址QsizeofQ)QnQFILE *Q?/font>把文件中n个sizeof大的数据d地址?/font>
rewindQFILE *Q?/font>把文件指针拨回到文g?/font>
fseekQFILE *QxQ?/1/2Q?/font>Ud文g指针。第二个参数是位U量Q?代表从头U,1代表从当前位|移Q?代表从文件尾UR?/font>
feof(FILE *)判断是否C文g末尾

文g打开方式说明
r打开只能ȝ文g
w建立供写入的文gQ如果已存在抹d有数?/font>
a打开或徏立一个把数据q加到文件尾的文?/font>
r+打开用于更新数据的文?/font>
w+建立用于更新数据的文Ӟ如果已存在就抹去原有数据
a+打开或徏立用于更新数据的文gQ数据追加到文g?/font>

注:以上用于文本文g的操作,如果是二q制文g在上述字母后加“b”?

我们用文件最大的目的是能让数据保存下来。因此在要用文g中数据的时候,是?把数据读C个结构(一般保存数据多用结构,便于理Q中去,再对l构q行操作卛_。例如,文gaa.data中存储的?0个学生的成W{信息,要遍?q些信息Q对其进行成l输出、排序、查扄工作Ӟ我们把q些信息先读入到一个结构数l中Q再对这个数l进行操作。如下例Q?/font>

#include<stdio.h>
#include<stdlib.h>
#define N 30

typedef struct student /*定义储存学生成W信息的数l?/
{
char *name;
int chinese;
int maths;
int phy;
int total;
}ST;

main()
{
ST a[N]; /*存储N个学生信息的数组*/
FILE *fp;
void (*process[3])(ST *)={Output,Bubble,Find}; /*实现相关功能的三个函?/
int choice,i=0;
Show();
printf("\nChoose:\n?");
scanf("%d",&choice);
while(choice>=0&&choice<=2)
   {
   fp=fopen("aa.dat","rb");
   for(i=0;i<N;i++)
      fread(&a[i],sizeof(ST),1,fp); /*把文件中储存的信息逐个d数组中去*/
   fclose(fp);
   (*process[choice])(a); /*前面提到的指向函数的指针Q选择操作*/
   printf("\n");
   Show();
   printf("\n?");
   scanf("%d",&choice);
   }
}

void Show()
{
printf("\n****Choices:****\n0.Display the data form\n1.Bubble it according to the total score\n2.Search\n3.Quit!\n");
}

void Output(ST *a) /*文件中存储的信息逐个输出*/
{
int i,t=0;
printf("Name Chinese Maths Physics Total\n");
for(i=0;i<N;i++)
   {
   t=a[i].chinese+a[i].maths+a[i].phy;
   a[i].total=t;
   printf("%4s%8d%8d%8d%8d\n",a[i].name,a[i].chinese,a[i].maths,a[i].phy,a[i].total);
   }
}

void Bubble(ST *a) /*Ҏ(gu)l进行排序,q输出结?/
{
int i,pass;
ST m;
for(pass=0;pass<N-1;pass++)
   for(i=0;i<N-1;i++)
      if(a[i].total<a[i+1].total)
         {
         m=a[i]; /*l构互换*/
         a[i]=a[i+1];
         a[i+1]=m;
         }
Output(a);
}

void Find(ST *a)
{
int i,t=1;
char m[20];
printf("\nEnter the name you want:");
scanf("%s",m);
for(i=0;i<N;i++)
   if(!strcmp(m,a[i].name)) /*Ҏ(gu)姓名匚w情况输出查找l果*/
   {
   printf("\nThe result is:\n%s, Chinese:%d, Maths:%d,     Physics:%d,Total:%d\n",m,a[i].chinese,a[i].maths,a[i].phy,a[i].total);
   t=0;
   }
if(t)
   printf("\nThe name is not in the list!\n");
}

链表Q?/strong>
链表是C语言中另外一个难炏V牵扯到l点、动态分配空间等{。用l构作ؓ链表的结Ҏ(gu)非常适合的,例如Q?

struct node
{
int data;
struct node *next;
};

其中next是指向自w所在结构类型的指针Q这样就可以把一个个l点相连Q构成链表?/font>

链表l构的一大优势就是动态分配存储,不会像数l一样必d定义时确定大,造成不必要的费。用malloc和free函数卛_实现开辟和释放存储单元。其中,malloc的参数多用sizeofq算W计得到?/font>

链表的基本操作有Q?strong>正、反向徏立链表;输出链表Q删除链表中l点Q在链表中插入结?/strong>{等Q都是要熟练掌握的,初学者通过d的方式能比较形象地理解徏立、插入等实现的过E?

typedef struct node
{
char data;
struct node *next;
}NODE; /*l点*/

正向建立链表Q?
NODE *create()
{
char ch='a';
NODE *p,*h=NULL,*q=NULL;
while(ch<'z')
   {
   p=(NODE *)malloc(sizeof(NODE)); /*强制cd转换为指?/
   p->data=ch;
   if(h==NULL) h=p;
      else q->next=p;
   ch++;
   q=p;
   }
q->next=NULL; /*链表l束*/
return h;
}

 

逆向建立Q?/font>

NODE *create()
{
char ch='a';
NODE *p,*h=NULL;
while(ch<='z')
   {
   p=(NODE *)malloc(sizeof(NODE));
   p->data=ch;
   p->next=h; /*不断地把head往前挪*/
   h=p;
   ch++;
   }
return h;
}

 

用递归实现链表逆序输出Q?/font>

void output(NODE *h)
{
if(h!=NULL)
   {
   output(h->next);
   printf("%c",h->data);
   }
}

插入l点Q已有升序的链表Q:

NODE *insert(NODE *h,int x)
{
NODE *new,*front,*current=h;
while(current!=NULL&&(current->data<x)) /*查找插入的位|?/
   {
   front=current;
   current=current->next;
   }
new=(NODE *)malloc(sizeof(NODE));
new->data=x;
new->next=current;
if(current==h) /*判断是否是要插在表头*/
   h=new;
else front->next=new;
return h;
}

 

删除l点Q?/font>

NODE *delete(NODE *h,int x)
{
NODE *q,*p=h;
while(p!=NULL&&(p->data!=x))
   {
   q=p;
   p=p->next;
   }
if(p->data==x) /*扑ֈ了要删的l点*/
   {
   if(p==h) /*判断是否要删表头*/
   h=h->next;
      else q->next=p->next;
   free(p); /*释放掉已删掉的结?/
   }
return h;
}


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1217307



]]>
C/C++头文件一?/title><link>http://m.tkk7.com/badboyryan/articles/69110.html</link><dc:creator>谈笑有`?/dc:creator><author>谈笑有`?/author><pubDate>Tue, 12 Sep 2006 02:46:00 GMT</pubDate><guid>http://m.tkk7.com/badboyryan/articles/69110.html</guid><wfw:comment>http://m.tkk7.com/badboyryan/comments/69110.html</wfw:comment><comments>http://m.tkk7.com/badboyryan/articles/69110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/badboyryan/comments/commentRss/69110.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/badboyryan/services/trackbacks/69110.html</trackback:ping><description><![CDATA[C、传l?C++<br /><br />#include <assert.h>    //讑֮插入?br />#include <ctype.h>     //字符处理<br />#include <errno.h>     //定义错误?br />#include <float.h>     //点数处?br />#include <fstream.h>    //文g输入Q输?br />#include <iomanip.h>    //参数化输入/输出<br />#include <iostream.h>   //数据输入/输出<br />#include <limits.h>    //定义各种数据cd最值常?br />#include <locale.h>    //定义本地化函?br />#include <math.h>     //定义数学函数<br />#include <stdio.h>     //定义输入Q输出函?br />#include <stdlib.h>    //定义杂项函数及内存分配函?br />#include <string.h>    //字符串处?br />#include <strstrea.h>   //Z数组的输入/输出<br />#include <time.h>     //定义关于旉的函?br />#include <wchar.h>     //宽字W处理及输入Q输?br />#include <wctype.h>    //宽字W分c?br /><br />//////////////////////////////////////////////////////////////////////////<br /><br />标准 C++ Q同上的不再注释Q?br /><br />#include <algorithm>    //STL 通用法<br />#include <bitset>     //STL 位集容器<br />#include <cctype><br />#include <cerrno><br />#include <clocale><br />#include <cmath><br />#include <complex>     //复数c?br />#include <cstdio><br />#include <cstdlib><br />#include <cstring><br />#include <ctime><br />#include <deque>      //STL 双端队列容器<br />#include <exception>    //异常处理c?br />#include <fstream><br />#include <functional>   //STL 定义q算函数Q代替运符Q?br />#include <limits><br />#include <list>      //STL U性列表容?br />#include <map>       //STL 映射容器<br />#include <iomanip><br />#include <ios>       //基本输入Q输出支?br />#include <iosfwd>     //输入Q输出系l用的前置声明<br />#include <iostream><br />#include <istream>     //基本输入?br />#include <ostream>     //基本输出?br />#include <queue>      //STL 队列容器<br />#include <set>       //STL 集合容器<br />#include <sstream>     //Z字符串的?br />#include <stack>      //STL 堆栈容器    <br />#include <stdexcept>    //标准异常c?br />#include <streambuf>    //底层输入Q输出支?br />#include <string>     //字符串类<br />#include <utility>     //STL 通用模板c?br />#include <vector>     //STL 动态数l容?br />#include <cwchar><br />#include <cwctype><br /><br />using namespace std;<br /><br />//////////////////////////////////////////////////////////////////////////<br /><br />C99 增加<br /><br />#include <complex.h>   //复数处理<br />#include <fenv.h>    //点环境<br />#include <inttypes.h>  //整数格式转换<br />#include <stdbool.h>   //布尔环境<br />#include <stdint.h>   //整型环境<br />#include <tgmath.h>   //通用cd数学?img src ="http://m.tkk7.com/badboyryan/aggbug/69110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/badboyryan/" target="_blank">谈笑有`?/a> 2006-09-12 10:46 <a href="http://m.tkk7.com/badboyryan/articles/69110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言试题的讲解分析http://m.tkk7.com/badboyryan/articles/69102.html谈笑有`?/dc:creator>谈笑有`?/author>Tue, 12 Sep 2006 02:23:00 GMThttp://m.tkk7.com/badboyryan/articles/69102.htmlhttp://m.tkk7.com/badboyryan/comments/69102.htmlhttp://m.tkk7.com/badboyryan/articles/69102.html#Feedback0http://m.tkk7.com/badboyryan/comments/commentRss/69102.htmlhttp://m.tkk7.com/badboyryan/services/trackbacks/69102.html下面是网友Jackie214发布的答?其认真态度令我深受感动.q些题是?000q在做培训时为学员们设计?但我已经q?q没有接触过vc++下的c语言~程??q没接触unix下的c语言~程?所?除了一些核心思想令我l生隑ֿ?其他一些语法细节和当初出题的意图何?我也差不多忘C!前天把这个测试题发布出来,是因为前一阉|知道我多q前写的一些内容又要被别h加入到其书籍中出?我只是对一些h惯于借鉴别h的东西而当作自己成q性格很不赞赏,但这般行为在商业上来说是无可厚非,甚至是值得学习,只是我自己做不出q样的事情来,反而有点自己没胆量吃葡?p吃葡萄的人酸),当时非常生气,又腾Zq些快被自己遗忘的东?前几天就Z把这个测试题发表在自qblog里了.我没有受q正规的计算机教?除了自学qK强的那本入门的c语言,也没有看qc语言斚w的经典名?很多东西都是自己瞎摸索出来的,所以有自己的讲课思\,但不一定严?q请看客多多谅解!
另外,我有q一D开发实践和教学l历?回过头来看K老爷子的那本c语言?觉得写得真的很不?没抓主重?讲解也不通俗,很多人都q么认ؓ,但也没有下定军_,吃上两年的苦,写一被绝对好q老K的书,我曾l有q这般想?但一直未能实?我期望书能通过试验来让读者轻村֭?q且学懂后还不容易忘?所以要把原理性的东西用通俗易懂的方式表现出?q要高度ȝ出核心思想,如果谁有q方面的心愿,不妨与我合作!
下面是网友Jackie214发布的答?随后是我的一点补?
Jackie214 发表?006-05-19 11:47 AM  IP: 61.154.9.*
int x=35;
char str[10];

//问:strlen(str)和sizeof(str)的值分别是多少Q?
// strlen(str) g定QstrlenҎ(gu)'\0'定字符串是否结束?
// sizeof(str)=10 sizeof一个数lؓ数组长度

strcpy(str,"www.it315.org"/*?3个字?/);
//?此时x和strlen(str)的值分别是多少Q?
// x ?5
// strcpy(char* dest, const char* src)
// Ҏ(gu)src来复制destQ依照src?\0'军_复制的长度,而dest必须要提供够的长度Q这里会引v溢出Qstrlenq回13Q但是数l外部的数据已经被破?/div>
//(作者注:我下面给Z更确切的{案 )

str="it315.org";//~译能通过吗?
// 数组不能赋|只能初始化。char str[10] = "it315.org";
// 而且初始化时~译器会查数l的长度与初始化串的长度是否匚w

char *pstr;
strcpy(pstr,"http://www.it315.org");
//上句~译能通过吗?q行时有问题吗?
// 可以通过~译Q但是pstr指向了常量区Q运行时最好只做读操作Q写操作不保?
//(作者注:我下面给Z更确切的{案 )

const char *p1;
char * const p2;
//上面两句有什么区别吗Q?
// const char* ?char const* 一P都是表示指向帔R的字W指针?
// char * const 表示指向字符的常量指?

p1=(const char *)str;
//如果是p1=strQ编译能够通过吗?明白Z么要cd转换Q类型{换的本质是什么?
// 可以通过~译。关于常量与非常量指针的关系是这LQ?
// const指针可以指向const或者非const区域Q不会造成什么问题?
// 非const指针不能指向const区域Q会引v错误?

strcpy(p1,"abc");//~译能够通过吗?
// 不能通过Qstrcpy( char*, const char*); char* 不能指向const char*

printf("%d",str);//有问题吗Q?
// 没有问题Q输出的是str的地址信息?

pstr=3000;//~译能过吗?如果不行Q该如何修改以保证编译通过呢?
// 不能通过Qchar* pstr表示pstr是个字符指针Q不能指?000的整形变量?
// 修改的话Q可以这Ppstr = (char*)3000Q把pstr指向3000q个地址;

long y=(long)pstr;//可以q样做吗Q?
// 可以Qy的gؓpstr所指的地址。不q如果是Ua要地址的话Q最好是用unsigned long?

int *p=str;
*p=0x00313200;
printf("%s",str);//会是什么效果?提示0x31对应字符'1',0x32对应字符'2'?
// 首先~译未必会过养I有些~译器可能不允许int * 直接指向char*。最好是改ؓint *p = (int*)str;
// q关了效果就是什么东襉K没有。int *p=str; p为str所指的地址Q?p表示修改了str所指向的内存?
// ׃sizeof(int)?2位机上,int?个字节(其实具体要看~译器的配置文gQ好像是limit.hQ一般是4个字节)所以修改了str[0]-str[3]
// ׃0x00313200头尾都是0Q所以字W串?\0'开_什么都打印不出来。这里有个Big-endin和little-endin的问题。以0x31323334Z
// little-endin的机器上面,0x31323334在内存中排列序?4 33 32 31Q输Zؓ4321Q如INTEL芯片的pc
// big-endin机器上面?1 32 33 34 Q输Zؓ1234Q如IBM POWERPC

p=3000;//p+1的结果会是多?
// 3000+sizeof(int); 指针+1均ؓ原来地址加上sizeof(指针所指的数据cd)

char *pc=new char[100];//上述语句在内存中占据几个内存块,怎样的布局情况Q?
// 本npc会占用函数栈一?字节的指针长度(具体是否?个字节要看机器和~译器)?
// new会在堆上甌100个字节sizeof(char)的连l空间?

void test(char **p)
{
*p=new char[100];
}//q个~译函数有问题吗Q外面要调用q个函数Q该怎样传递参敎ͼ
// 该程序没有问题。需要在函数中对指针所指的地址q行变化是必M人指针的地址?
// 原因是这LQ如果传入的为指针本w,在函数调用的时候,实参会被复制一个实例,q样׃是原来的指针了,对该指针本nq行的Q何改变都不能传递回M?
// 可以q样理解Q如果传入的参数为intQ那么对int本n的值的改变׃不回dQ加?也是一L?


//能明白typedef int (*PFUN)(int x,int y)及其作用吗?
// 定义了一个函数指针类型的宏,q样PFUNpC指向返回gؓintQ且同时?个int参数的函数指针类型了?
// 可以用来定义q样的变量:
// 比如有个函数为int fun( int x, int y );
// PFUN p = fun;
//(作者注:我下面给Z更确切的{案) 
--------------------------------------------------------------------------------------------------------------
下面是我的一点补?
W二?
int x=35;
char str[10];
strcpy(str,"www.it315.org"/*?3个字?/);
//?此时x和strlen(str)的值分别是多少Q?
{?strlen的gؓ13,在VC++环境?x的值是要改变的(其他~译器下没试,).虽然表面上看?在程序中q没有修改x的?但是实际q行的结果是上面的x的值发生了修改,q是因ؓstrcpy以后,把多余的数据拯q了str的邻?intcd的x)?所以x的数据也变?q是一个曾让我刻骨铭心的问?在我刚出道时遇到q个问题,虽然在朋友的帮助下解决了q个问题,但一直不明白x的gؓ何变?只有最后走上培训教师的岗位,才开始梳理自己曾l的困惑,才开始ȝ以前的经验供学员们借鉴.我觉得这个题目的价值非怹?它能引v学员对字W串拯界问题的够重?q且通过q个问题更能明白字符串的处理是怎么回时,更能明白字符串与字符数组的关p?字符串就是一个字W数l?只是把这个字W数l用在处理串的函C?q些函数不考虑数组的长?只是C数组的首地址,从首地址开始处?q在遇到0时结束处?
W四?
char *pstr;
strcpy(pstr,"http://www.it315.org");
//上句~译能通过吗?q行时有问题吗?
{? ~译可以通过Q但是pstr没有q行有效的初始化,它指向了一个不定的内存区Q运行时会出现内存不可写错误!
最后一?
//能明白typedef int (*PFUN)(int x,int y)及其作用吗?
{?函数指针最大的用处在于它可以被一个模板方法调?q是我在学java的设计模式时领?zhn)到?例如,有两个函数的程l构完全一?只是内部调用的具体函C?如下所C?
void func1()
{
         //一D|E代码和面向斚w的代?如安全检?日志记录{?/div>
         int sum = add( x , y);
        //一D|E代码和面向斚w的代?如安全检?日志记录{?/div>
}
void func2()
{
         //与func1完全相同的一D|E代码和面向斚w的代?如安全检?日志记录{?/div>
         int difference = sub( x , y);
        //与func1完全相同的一D|E代码和面向斚w的代?如安全检?日志记录{?/div>
}
那么,可以只定义一个函?如下所C?/div>
void func(PFUNC p)
{
         //与func1完全相同的一D|E代码和面向斚w的代?如安全检?日志记录{?/div>
         int difference = p( x , y);
        //与func1完全相同的一D|E代码和面向斚w的代?如安全检?日志记录{?/div>
}
调用E序在调用时,让参数p分别指向add和sub函数可以了.
对于其他题目的讲?׃我目前写作和工作的重点已完全不在c语言斚w?也没有时间一一解答,借用Jackie214发布的答案来回应大家.


]]> վ֩ģ壺 þþþþþùѿ| ޾ƷһۺAV| þùƷһ| ˳ۺ| ҹƵ| ޾Ʒ | a߹ۿַȫ| ޾ƷӰ߲Ʒ| Ļ| AVۺɫһ| 2021Ƶ| ޹˾þ| ߲ŸԲ| AVպAVһ| aëƬa԰Ħ| պþӰԺ | һѹۿ| ƬAëƬ鴤| ëƬ| պһ234| þҹҹ³³Ƭ| þþþþ޾Ʒ| ѿAVƬ| Ʒɫͼ| avƬ߹ۿ16Ů| ÿձƬ35| ޾ƷŮþ7777777| Ļ뾫ƷԴ| ҹӰԺѹۿ| þþƷavƷ| Ļ޵Ӱ| 18վڵ| ɫվ| ޳AƬ߹ۿ벻| AVƬ߲Ψ| ҹ| þѾƷav| ŮڵƵվ| ȫ߹ۿѹۿȫ| ޳av߹ۿվ | aƬѹۿ|