C语言基础学习笔记

C语言基础学习笔记
C语言基础学习笔记

C语言基础学习笔记

(第一版修改)

丁炳亮

1数据类型和表达式

1.1计算机内数据存储方式

理解与测试:

什么是补码?我们得先知道模的概念。模“模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范围,即都存在一个“模”。例如:时钟的计量范围是0~11,模=12。表示n位的计算机计量范围是0~2^(n)-1,模=2^(n)。

“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算。例如:假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨4小时,即:10-4=6;另一种是顺拨8小时:10+8=12+6=6在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。对“模”而言,8和4互为补数。实际上以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特性。共同的特点是两者相加等于模。

二进制中整数的补码求法是:正数的补码为原码,负数的补码是符号位不变其他位全部取反再整个数加1。我们可以通过下面的代码看下负整数在计算机内部的表示。

void f(int n)

{

unsigned int i;

for(i=1,i<<=15;i;i>>=1)

{

if(i&n)

printf("1");

else

printf("0");

}

printf("\n");

}

main()

{

int a=-0xff;

f(a);

}

输出的结果是1111111100000001。

1.2变量与常量

理解与测试:

1)类型声明

在计算机内部数据是以字节为单位存储的,但是我们需要的数据类型有很多种,每种数据类型所占字节和存储方式都不一样。类型声明的作用就是告诉计算机以哪种“格式”去读写该数据数据。

类型说明符变量名1,变量名2......,变量名n;

类型说明符有基本类型(字符型、整数型、单/双精度型)、高级类型(结构体型、共用体型、枚举类型)、指针型等,其中指针类型包括指向基本类型的指针类型、指向高级类型的指针型和指向函数的指针类型(指向函数指针声明格式在后面章节)。

2)符号常量的定义

#define 标识符常量;

使用该种方法定义符号常量一个是可以使代码便于阅读理解,另一个是方便代码内部多个相同常量的统一修改。

总结与注意

在写计算式的时候要考虑变量是否会越界。一般来说计算式子时是先强制转换成式子中最大存储空间的数据类型(不包括被赋值的变量),还要注意不同的类型数据在不同的编译器中所占的内存有可能是不一样的,例如有些编译器整型是占2个字节有些是占4个字节。同时还要考虑到符号的优先级和结合顺序,如果按符号的优先级和结合顺序运算过程中有越界的那么整个计算结果可能和预想的不一样了,例如int i=100;i = 500*i/i;最后i=-155。

1.3输出输入

理解与测试:

1)格式化输入输出函数可以按设定的格式和设定的数据类型接收和输出多个变量。控制格式和数据类型的是数据控制符。

2)字符和字符串可以用专门的输出\输入函数。主要有getch(); putch();getchar(); putchar(); gets(); puts();其中getch()和putch()是conio.h中声明,getch()不需要等待回车键就返回字符并立即执行下面一语句符,getch()不在屏幕显示输入的字符。getchar();putchar(); 在stdio.h中声明。getchar()读取键盘上的一个字符,立即返回并显示在屏幕上,需要等待回车键才能执行下

一条语句。例如下面的代码:

int main(void)

{

char ch,i;

for(i=0;i<10;i++)

{

ch = getchar();

putchar(ch);

}

getch();

}

输入:I LOVE YOU

输出:I LOVE YOU

总结与注意

格式输入函数中的参数是变量存放的地址,所以变量前面要”&”符号。如果是数组则可以直接用数组名,因为数组名就是指向该数组首地址的指针常量。

1.4运算符号

理解与测试:

1)表达式中符号的运算顺序是有先后的,根据符号的优先级和结合性(左结合/右结合)来判定。如果是几个符号连在一起C内部是怎么去读的呢?有一个很简单的规则:每一个符号应该包含尽可能多的字符。也就是说,编译器读取符号的方法是,从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那么在读入下一个字符,直到与下个字符组合成的符号没有意义为止。例如:a---b;这个表达式等效于(a--)-b;

2)复合赋值符及表达式在赋值符“=”之前加上其他双目运算符号可以构成复合赋值符。如:+=、-=、*=、/=、%=。构成复合赋值表达式的一般格式为

变量双目运算符= 表达式

等价于

变量= 变量运算符表达式

可以这么去理解,等号左边的相当于变量自增、自减、自除、自取余一个数,这个数由右边的表达式计算得到。如:int a=7,b=3,c=3;a+=b+=c+=5;运算后是a=18,b=11,c=8。

3)C中唯一一个三目运算符是条件运算符,由“?”和“:”构成。两个符号必须按下面的格式一起使用:

表达式1?表达式2:表达式3

三个表达式可以是任意的合法表达式,条件运算符的运算规则如下:如果表达式1的值为真,那么整个表达式的值为表达式2的值,否则为表达式3的值。

4)sizeof()也是一个运算符号,它可以对一个数据类型或一个变量取类型长度。但是当一个数组名作为一个实参传递给函数时,在函数内部是不能用sizeof来获取该数组的长度的。因为数组名是一个指向数组首地址的指针,使用sizeof只能取得实参指针类型长度。

5)比较少用到的符号是“:”和“,”。冒号运算符在C中有三种用途,第一种是我们上面讲到的与“?”构成三目运算。第二种是在switch中放在常量表达式后面。第三种用法是在结构体中定义位域时用到。

struct 位域结构名

{ 位域列表 };

其中位域列表的形式为:类型说明符位域名:位域长度

例如:

struct bs

{

int a:8;

int b:2;

int c:6;

};

逗号运算符的功能是把两个表达式连在一起组成一个新的表达式,称为逗号表达式。其一般格式为

表达式1,表达式2,表达式3,...,表达式n;

其求值过程是自左向右求两个表达式的值,并以最后一个表达式的值作为整个逗号表达式的值。例如for(a=0,b=0,c=0;b<10,a<20;b++,a++)++c;运算后c=20,如果把中间的两个语句前后调换for(a=0,b=0,c=0;b<10,a<20;b++,a++)++c;运算后c=10。

6)不同的数据类型的量混合运算的时候,系统会临时把算式中长度小的数据类型自动转换成长度大的数据类型。在某些时候我们需要临时改变一个数据的类型或者说是读取“格式”,我们可以使用强制类型转换符,”(type)”。使用的格式一般如下:

(类型说明符)表达式

要得到一个数据类型的类型说明符很容易。只要知道如果声明一个给定类型的变量,那么就可以得到该数据类型的转换符就是把声明中变量名和声明的分号去掉。例如:(int)、(float)、(char *)、(int(*)())等等。

总结与注意

1)“==”和“=”这两个符号也容易在判断语句内出错,严重的还会出现死循环。

2)自增“++”和自减“--”可以作为前缀也可以作为后缀。作为变量前缀时,在表达式中每次取用变量值运算前先自增/自减,作为变量后缀时,在表达式中每次取用变量值运算后

main()

{

int i=2,j=1,n;

printf("%d\n",i++);

n = i++>j?i++:j;

printf("%d\n",n);

getch();

}

输出结果:

2

4

3)在写式子时要注意运算符号对变量的副作用,单目运算有“++”和“--”,双目运算有“=”。

4)位运算符号与逻辑符号容易混淆的有“&”和“&&”、“|”和“||”、“~”和“!”。前面两个可以这么记,位运算是单个的所以符号也是单个的。

5)在使用位运算符号时要主要如果是有符号数则是对他们的补码执行位运算。对于有符号的整数型使用左移“<<”右补0,使用右移“>>”左补1。如下代码:

void f(int n)

{

unsigned int i;

for(i=1,i<<=15;i;i>>=1)

{

if(i&n)

printf("1");

else

printf("0");

}

printf("\n");

}

main()

{

int a=-0xff;

f(a);

a>>=1;

f(a);

getch();

}

输出的结果是:

1111111100000001

1111111110000000

6)运算符优先级可以简单归纳如下几点:

①单目运算符比任何一个真正意义上的运算符的优先级高。

②逻辑运算符比关系运算符优先级高。

③移位运算符表算术运算符优先级低,但高于关系运算符。

2程序控制结构

2.1选择结构

理解与测试:

使用if-else多层嵌套时else是与上面同一层的最近if相结合的,在程序设计时有过多的分支最好要选择使用if-else,当然如果可以使用switch语句还是尽量选择switch语句或者使用其他能使代码简洁易懂的方法。如下面的代码:

main()

{

int a=10,b=6,c=7,d=8,e=9,f=10;

if(a>b)

{

printf("%d\n",a);

if(b>c)

{

printf("%d\n",b);

if(c>d)

{

printf("%d\n",c);

if(d>e)

{

printf("%d\n",d);

if(e>f)

{

printf("%d\n",e);

}

else

printf("%d\n",f);

}

}

}

}

getch();

}

这种代码又长又难看懂,更要命的是经常搞不懂下面的大括号对应上面的哪个大括号。

改进后的代码如下

main()

{

int a=10,b=6,c=7,d=8,e=9,f=10;

while(1)

{

if(a<=b)break;

printf("%d\n",a);

if(b<=c)break;

printf("%d\n",b);

if(c<=d)break;

printf("%d\n",c);

if(d<=e)break;

printf("%d\n",d);

if(e<=f)

printf("%d\n",e);

else

printf("%d\n",f);

break;

}

getch();

}

第二种方法比第一种方法来看上去更干净,理解上差不了多少。

2)

总结与注意

switch语句中每一个分支结束都要有break;语句,如果没有是继续执行下面分支,可能会得到和预料不同的效果。还要注意,case后面跟的一定是整数型或符号型常量表达式,不能是变量,并且不用有相同值的变量表达式,不然会矛盾的。

2.2循环结构

理解与测试:

1)主要有for、while、do-while这三种结构循环体,其中最后一种是比较少用到的,因为一般情况都可以用前面两种替代。

2)循环体结构中括号的表达式要知道时候退出,有时候还要知道循环体运行多少次。在循环体内部也可以使用continue语句跳过本次循环,进入下一次循环,或者用break语句退出当前层循环。

总结与注意

循环结构中表达式的设计很重要。在for循环结构我们经常用到从0到x,循环体执行

x+1次,可以写成for(i=0;i0;i-=3);这个循环语句的运行结果一般不是我们想要的。把“==”不注意写成“=”也是容易造成死循环的结果。

3数组

3.1一维数组

理解与测试:

1)一维数组的定义如下:

类型说明符数组名[常量表达式]

如果定义时就进行初始化,常量表达式可以省略。动态存储的数组没有初始化所有元素的值都为随机。静态存储的数据没有初始化所有的元素自动赋0。

2)一维数组名是一个指针常量,指向数组的首地址。由于是指针常量所以不能对其赋值,只能当指针引用。同理一个数组不能对另一个数组整体赋值。数组引用时下标是从0开始计算的。

3)字符型数组初始化可以直接赋值字符串。char s[]={“Happy”};或者char s[]=”Happy”;。总结与注意

数组引用时下标不要越界,字符串数组初始化时,数组元素个数要比字符串多一个,因为字符串结束有个“\n”符,否则越界就会发生预料不到的结果。如下:

main()

{

char a[8]="abcdefgh";

printf("%s",a);

getch();

}

输出结果:

main()

{

int a[2],i;

for(i=0;i<8;i++)

scanf("%d",&a[i]);

getch();

}

上面这个代码当输入字符超过2个时可能出现无法运行的结果。

总结与注意

数组名作为函数参数时传递给形参的是数组的指针,而且在子函数中无法用sizeof取得数组的大小,所以有需要时可以用另一个参数传递数组的大小。数组作为形参时可以写成int f(int a[])或者int f(int * a)或者int f(int a[10]),他们三者都一样的,因为对于指针来说“[]”等效于“*”,数组做形参不会传递数组大小,int a[10]等效于int a[]。数组作为实参时可以写成f(a)或者f(&a[0])或者,因为a[0]的地址就是数组的首地址。但是要注意f(a[10])将是把a[10]作为实参传递过去,a[10]的值赋值给指针使用是危险的。

3.2多维数组

理解与测试:

多维数组和一维数组相似,只是使用了多个下标。多维数组其实可以理解为数组的元素又是一个数组。例如,二维数组可以保存一个矩阵,三维数组可以保存多个矩阵。

4函数

4.1函数的定义和调用

理解与测试:

1)函数定义一般格式如下

函数类型函数名(形参表)

{

声明部分;

语句部分;

return 表达式;

}

声明部分必须是放在函数的最前面,如果放在语句中则编译不能通过。

2)值参数是指,将实际参数的值传递到函数的形式参数中,这也是参数默认传递方式。函数调用中发生的数据传递是单向的,即只能把实际参数的只传递给形式参数,在函数调用过程中,形式参数发生改变,而实际参数中的值不会发生变化(形式参数可与实际参数同名)。引用参数是将实际参数的地址传递给函数的形式参数。

总结与注意

1)形参必须是变量,用于接收实参传递过来的值。实参可以常量、变量、表达式、函数调用等,无论实参是何种类型的量,在函数调用时都必须有确定的值。实参与形参,数量和类型要能一一对应。

2)函数如果在定义前使用,或者在其他文件中。那么必须先声明,再使用。

函数运行的时候是根据形参类型去读写形参变量的,而传递过来的实参会根据函数声明

就直接把代表实参的二进制码直接复制给形参。如果实参和形参的数据类型不对,而函数运行时又是根据自己的形参类型去读取形参变量的,所以就会发生读取出错,严重的会使程序停止。

声明返回值类型是把数据自动转换成相应的类型才返回给调用者。声明函数的返回值和定义函数时的返回值不一样编译时会提示类型出错。在使用前没有声明或者声明的函数没有声明返回值则编译时默认的返回值都是int型,若该函数定义时声明的返回值不是int型,编译器就也会提示类型错误。

3)大多数C语言实现都是通过函数main的返回值来告诉操作系统该函数是否执行成功。一般是返回0表示成功,返回其他值则表示失败。如果main中没有return 0;返回的是一个int 型数值,但是不能保证值为0。

4.2局部变量和全局变量

理解与测试:

1)全局变量也叫外部变量,它是定义在函数外部。它不属于那个函数,而属于一个源程序文件。局部变量是定义在函数内部,可以在函数的声明中定义,也可以在一个语句块中定义。变量的作用范围都是相对于同一层次来讲的。例如函数有声明变量,在函数的语句块内又有定义相同名称的变量,则起作用的是语句块内的变量,虽然它们名称相同但是互不影响。如下面的代码:

int k = 10;

void f(int i)

{

int k = i;

k++;

printf("%d\n",k);

}

main()

{

int k;

printf("%d\n",k);

f(10);

for(k=0;k<5;k++)

{

int k = 5;

printf("%d\n",k);

}

getch();

}

1692

11

5

5

5

5

5

2)静态局部变量没有初始化的值为0。静态全局变量可以将作用范围限制在一个程序文件模块中。

3)如果要引用另一个源程序文件的全局变量我们可以在本源程序文件中使用extern声明另一个源程序文件的变量。就可以从“声明”开始的地方合法地使用该全局变量了。其一般格式如下

extern (类型名) 变量表;

其中类型名可以省略。

4.3内部函数与外部函数

在一个文件模块中要调用另一个文件模块的函数是,需要对函数进行外部声明。外部声明的一般格式为

extern 函数类型函数名(参数表说明)

extern表示声明的函数是外部函数,它定义在其他文件模块中。

内部函数也称为静态函数,使用内部函数可以避免各文件模块函数的干扰,使不同的人可以分别编写不同的函数,而不用当心所用函数是否与其他文件模块中的函数重名。

4.4函数的递归与迭代

理解与测试:

1)在调用一个函数的过程中又直接或间接地调用该函数本身,称为函数的递归调用,带有递归调用的函数也称为递归函数。递归其实包括两个过程,一个是递推的过程,函数不断调用自己知道边界。另一个是回归过程,到了边界后一层层把值返回。递推的边界也叫递推出口,我们设计递推函数时一定要有递推出口,不然会进入死循环。

2)递推函数的设计首先要找到事物存在的递推关系。我暂且下一个定义:一个事物包含跟他同概念的事物。例如一根木棍截取一部分还是一根木棍,只是长度变小了。这种包含关系也是这样,被包含的事物概念没有变化只是数量不同而已。

接使用我们这个还没设计完的函数(提前使用)。例如要设计个程序把一根木棍截成多截,我们可以这么想,要把木棍截成多截只需要分两步,第一步把木棍截取一截,第二步把剩下的截成多截。因为剩下的还是一个木棍那么就可以调用函数自身来处理。但是我们没法理解它怎么能自己用自己呢,其实可以理解为里面使用的是它包含的跟它同概念函数而已,由于他们都是一样的规律所以就不用再去设计一个函数了,实际上他们确实不是同一个函数,只是同概念,因为在真正执行的过程中是利用了第一个函数的规律在再运行了一个相同概念的子函数,没必要去编写n个同概念的函数。如下图的包含关系。

3)下面用几个实例来做说明

求n!:([n!=1 n=0,1] [n!=n*(n-1)!n>1])

分析:像这种有递推公式的就有很明确的递推关系。我们的目的是要求n!,我们只需要两步,第一步是把n!看成n*(n-1)!。第二步求(n-1)!。由于n!和(n-1)!都是求某一个数的阶乘,所以调用函数本身来处理(n-1)!。我们的思路知道此为止,不要在一直想下面怎么处理,程序会按我们这思路自己往下递推的。

程序设计:f(int n)

一、if(n==1||n==0) n!=1; //设计边界

二、n!= n*f(n-1); //利用跟被包含的下一个同概念函数计算

//这里千万不要感觉f()没有写完就不能用,其实递归函数方便的

//就可以随便大胆的调用“自己”。

代码如下:

double fact(int n);

double fact1(int n);

main()

{

int n;

printf("Input n:");

scanf("%d",&n);

printf("%d! = %.0f\n",n,fact(n));

printf("%d! = %.0f\n",n,fact1(n));

getch();

}

double fact(int n)

{

double f;

if(n==1||n==0) //递归函数出口

f = 1;

else

f = n*fact(n-1);

return f;

}

汉诺塔问题:

分析:要把A上的n个盘借助C搬到B上,我们的只需要两步。第一步是把n-1个盘搬到C上,再把A上的最后一个盘搬到B。第二步是把C上的n-1个盘借助A搬到B上。由于把n个盘和把n-1个盘的规律相同,所以可以直接调用函数本身。

代码如下:

void hanio(int n,char a,char b,char c);

main()

{

int n;

printf("Input the number of disks:");

scanf("%d",&n);

printf("The steps for %d disks are:\n",n);

hanio(n,'A','B','C');

getch();

}

void hanio(int n,char a,char b,char c)

{

if(n==1) /* 递归函数出口*/

printf("%c-->%c\n",a,b);

else

{

hanio(n-1,a,c,b); /* 利用C把n-1个片从A移到B */

printf("%c-->%c\n",a,b);

hanio(n-1,c,b,a); /* 利用B把n-1个片从C移到A */

}

九连环解法:

分析:我们这边设计是可以解n连环的程序。九连环有个规律是要解或上第n个环必须解去n-1个环。我们解n个环只需要分成两步来处理,第一步就是把解下1个环。第二步就是把剩下n-1个环用解n个环的函数来处理。解一个环的过程是些解下n-2个环,再把第n 个环解下,再安上n-2个环(剩下部分要都是未解开的环)。安n个环的步骤过程和解n个环的步骤过程相似。

代码如下:

#include "Stdio.h"

#include "Conio.h"

static int upstep = 0;

static int downstep = 0;

void UpRing(int n); /*加上函数说明,否则编译将会出一点小错误*/

void DownRing(int n) /*下环的逻辑就体现在这里*/

{

if(n>2) DownRing(n-2);

printf("DW:%d\t",n);++downstep;

if(n>2) UpRing(n-2);

if(n>1) DownRing(n-1);

}

void UpRing(int n) /*上环的逻辑则体现在这里*/

{

if(n>1) UpRing(n-1);

if(n>2) DownRing(n-2);

printf("UP:%d\t",n);++upstep;

if(n>2) UpRing(n-2);

}

main()

{

int n;

scanf(“%d”,&n);

puts("Starting...");

DownRing(n);

puts("\nEnding...");

printf("\nup = %d\tdown = %d\n",upstep,downstep);

getch();

}

4)迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法,即一次性解决问题。迭代法又分为精确迭代和近似迭代。“二分法”和“牛顿迭代法”属于近似迭代法。迭代法的思路和递推法相反,迭代是从开始往后面推导。例如计算n!用迭代法如下:

double fact1(int n)

{

double f=1;

int i;

if(n==0)

return 1;

else

{

for(i=1;i<=n;i++)

{

f = f*i;

}

}

return f;

}

总结与注意

1)用递归法的步骤是:一、把一个事物截去一部分剩下的的部分还是不是该事物如果是就可用递推函数来求解。二、找到截去一部分(剩下的概念上还是该事物)的方法。三、需要把事物截取成多部分函数实现就可以分成两步,首先是用上面的方法把事物截去一部分,最后就是把剩下的部分用这个截去多段事物的函数本身处理。

2)递归函数的运行是一个不断递推的过程,每一次递推都要把数据压入栈,如果递推的步骤过多可能就会使栈溢出。所以能用迭代尽量用迭代,一般来说能写出递推式的都可以用迭代。

double fact1(int n)

{

int i;

if(n==0)

return 1;

else

{

for(i=1;i<=n;i++)

{

f = f*i;

}

}

return f;

}

5指针

5.1指针与简单变量

理解与测试:

简单的讲指针就是地址。指针变量的定义如下:

基本类型* 指针变量名;

指针定义完最好都进行初始化,初始化值可以为NULL。因为没有初始化的指针指向的地址时随机的,如果程序有引用是很容易出错的。

总结与注意

指针变量指向变量的首地址,指针引用指向的变量时是根据自己的类型来取变量值的,所以不能将不同类型的变量赋值个同一个指针,例如把一个整形指针赋值个符号指针,引用符号型指针指向的变量时只是整形的低字节。

5.2指针与数组

理解与测试:

1)数组名就是一个指向数组首地址的指针常量。对于指针数组符号’[]’相当于指针符号’*’,所以数组元素的地址有下面几种表示:

&a[0].......&a[i]

a................a+i

pa.............pa+i

从技术上可以说数组就相当于指针,但是在声明一个数组,C语言编译时会分配一段固定的连续空间,而声明一个指针却不会。

2)实际上C语言只有一维数组。多维数组其实可以理解为指针数组和普通数组的结合。

例如,char a[2][5];可以理解为一个char *a[2]数组,里面的每个元素分别指向一个char b[5]数组。

在二维数组x中,数组名x表示数组的首地址,x[i]表示一个一维数组的名称,(也就是说x[i]不保存元素值),它只是一个地址。x和x[i]的值相等,但是*a!=*a[0],因为a是一个二维数组首地址指针,a[0]一个一维数组首地址指针,引用它们指向的变量时会根据自己类型性质定义变量的类型性质。如下代码:

void main()

{

char a[2][6]={"Hello","World"};

char * p;

p = a;

if(a==a[0])

printf("a==a[0]\n");

if(*a==*a[0])

printf("*a==*a[0]\n");

if(*p==*a[0])

printf("*p==*a[0]\n");

printf("%d\n",sizeof(a));

printf("%d\n",sizeof(a[0]));

getch();

}

运算结果:

a==a[0]

*p==*a[0]

12

6

x[i]表示数组的首地址,x[i][j]表示数组x[i]的第j+1个元素的值,&x[i][j]返回数组x[i]的第j+1个元素的地址。也可以使用*(x[i]+j)的方式表示第j+1个元素的值,而*(x[i]+j)又可表示为*(*(x+i)+j)。

3)指针的运算:赋值、间接运算、求地址、递增、递减、求差、比较。指针加上后减去一个整数偏移的长度等于这个整数乘以指针所指数据类型的长度。如下面的代码:

int main()

{

unsigned int i;

unsigned int *p = &i;

printf("%d %d",p,p+1);

getch();

}

运行输出:

5.3指针与字符串

理解与测试:

1)在C系统内部字符串当作一个一维数组,在内存中连续存放。结尾存放字符串结束符,就是ASCII码为0的空字符’\0’,所以字符串常量实质上是指向该字符串首字符的指针常量。如char * p = “point”。

数组名就是存放数组的首地址,如char sa[]= ”array”;。

2)因为字符串名就是指针常量,使用指针数组来存放字符串指针常量可以方便操作多个字符串。由于数组名也是一个指针常量,所以指针数组名是一个指向指针的指针,可以用“**”来读取他被指向的变量。例如下面的代码:

void main()

{

char * a[2]={"Hello","World"};

printf("%s\n",a[0]);

printf("%c\n",**a);

getch();

}

输出的结果是:

Hello

H

3)字符串出来函数主要有输入输出函数:scanf(),printf(),gets(),puts。专门字符串出来函数:strcpy(目的字符串,原字符串),目的字符串是字符串指针,原字符串可以是字符串指针也可以是一个字符串常量。strcat(目的字符串,原字符串),把原字符串中的字符串连接到目的字符串中字符的后面,并删去原字符串后面的字符串结束符。本函数返回的是目的字符串的首地址。strcmp(字符串1,字符串2),按ASCII码顺序比较两个字符串,字符串1等于字符串2返回0,大于返回1,小于返回-1。strlen(字符串),计算字符串长度,不包括结束符。

4)输入命令时,在可执行文件(命令)名的后面可以跟一些参数,这些参数被称为命令行参数。主函数mian(int argc,char * argv[]);有两个参数,第一参数argc接受命令行参数(包括命令名)个数。第二个参数argv[]是个指针数组,接受以字符串常量形式存放的命令行参数(命令名本身也作为一个参数)。例如下面的代码(文件名:test.exe):

int main(int a,char *v[])

{

int k,s=0;

s = s+atoi(v[k]);

printf("%d",s);

getch();

}

调出命令运行窗口(win7系统可以按windows键+R),输入文件的路径参数,如下图

运行结果:

6

总结与注意

1)使用一维数组和字符串指针都可以处理字符串,但是由于数组名是指针常量,要改变数组sa所代表的字符串只能改变数组内容,而字符串指针可以重新指向其他字符串。

例如:char sa[]=”Hello”;sa = “World”;这是错误的。因为sa只是指针常量,不能赋值。

2)使用二维数组和指针数组都可以处理多个字符串,但是由于指针数组保存的只是指向字符串的首地址的指针变量,所以是不能去修改字符串中的字符。如:**a=’h’;是错误的。

二维数组保存的是整个字符串,它可以任意修改字符串的字符。如下代码:

void main()

{

char a[2][6]={"Hello","World"};

**a = 'h';

**(a+1) = 'w';

printf("%s %s\n",a[0],a[1]);

getch();

}

运行输出:

hello world

5.4指针与函数

理解与测试:

1)指针可以作为函数的返回值。

2)每个函数的定义经过编译后都占用一段内存单元,该函数名就代表函数的入口地址。我们可以定义一个指向函数的指针,通过函数指针来调用函数。函数指针的定义如下:

类型名(*变量名)();例如:int (*funptr)();

或者

类型名(*变量名)(形参类型名列表);例如:int (*funptr)(int,int);用这种方式定义函数指针在引用时输入的形参要和定义的函数指针后面的类型名列表数量和类型相一致。

3)函数指针数组的声明、赋值、使用和函数指针变量相似。

声明:类型名(*变量名[])()

总结与注意

1)定义和引用函数指针时不要忘记变量名外面的括号。

2)函数指针是一种指针,当引用指向的函数时形参个数是由函数指针决定的,如果指针函数定义时形参和返回值类型和和指向的函数的形参和返回值类型不一致会怎样呢?如果不一致,那么,实参会根据函数指针的形参类型自动换行后的数值作为函数的形参变量,函数运行时是以函数声明的形参类型去读取形参变量,这是就会发生数据读写错误,严重的会越界使程序无法运行。返回值在函数内部根据函数的返回值类型自动类型转换,但是返回值的类型说明却是函数指针的返回值类型(函数本身是无返回值时而函数指针定义时有说明,那么返回值将是函数内最后一个式子的值),C语言是根据变量的类型说明读取数值的,所以调用函数者读得的返回值将是错误的,严重的可能会越界使程序无法运行。所以为了避免不必要的麻烦,在定义函数指针省略变量后面的形参类型列表,并且返回值类型要跟指向的函数返回值类型一致。我们分析下面的代码:

int fun(float a,float b)

{

return (a+b);

}

int main()

{

int(*f)(int ,int) = fun;

float(*f1)(float,float) = fun;

printf("%d\n",f(56,30));

printf("%f\n",f1(56,30));

getch();

}

上面的代码在一些编译器会有警告但可以运行,运行后输出第一个数是0,第二个数乱码。有些编译器直接运行出错。原因是函数指针f的形参是int型的,实参传入的时候以int 型格式的二进制码复制给函数的形参变量,而函数又是以float型的数据格式读写形参变量。函数指针f1的返回值是跟函数的返回值类型不对,函数返回的明明是int型数据,而指针函

汇编语言 快速入门

“哎哟,哥们儿,还捣鼓汇编呢?那东西没用,兄弟用VB"钓"一个API就够你忙活个十天半月的,还不一定搞出来。”此君之言倒也不虚,那吾等还有无必要研他一究呢?(废话,当然有啦!要不然你写这篇文章干嘛。)别急,别急,让我把这个中原委慢慢道来:一、所有电脑语言写出的程序运行时在内存中都以机器码方式存储,机器码可以被比较准确的翻译成汇编语言,这是因为汇编语言兼容性最好,故几乎所有跟踪、调试工具(包括WIN95/98下)都是以汇编示人的,如果阁下对CRACK颇感兴趣……;二、汇编直接与硬件打交道,如果你想搞通程序在执行时在电脑中的来龙去脉,也就是搞清电脑每个组成部分究竟在干什么、究竟怎么干?一个真正的硬件发烧友,不懂这些可不行。三、如今玩DOS的多是“高手”,如能像吾一样混入(我不是高手)“高手”内部,不仅可以从“高手”朋友那儿套些黑客级“机密”,还可以自诩“高手”尽情享受强烈的虚荣感--#$%&“醒醒!” 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指

C语言入门手册

●C语言入门手册 ●这里不是教你什么知识,而是给你澄清一些资料,只给对编程一窍不通的或 者刚入门的人看。如果你尚未学习或者才学习不够一天,一定要看这手册,这份手册已经讲述的知识,我们不会在版面给予回答,此手册我会尽量保持准确,但如有不正确,请指正,我也会不断更新此手册 ●Q:什么是C? ●A:一门面向过程的计算机语言,发明至今已经差不多有三十年历史,由于 它相对其他高级语言高效,运行效率又比较接近低级语言,所以至今仍得到广泛的引用,无论你用windows还是linux,你现在看到东西的底层都是用C 写的,而大部分的网络协议都是用C实现的,画面最漂亮的游戏用C实现的,工业控制程序也是用C实现的。C不是万能,也不是垃圾,只是一门某些方面适用,某些方面不适用的语言 ●Q:什么是C++? ●A:一门面向对象的计算机语言,发明至今已经有二十多年了。由于面向对 象编程对程序架构有较好的帮助,因为比较适合构建大型的系统(当然,学术界对此存在争论),但无论如何,C++由于和C一样接近底层,而且又面向对象,所以也得到广泛的使用。C++不是万能,也不是垃圾,只是一门某些方面适用,某些方面不适用的语言,不要向某一个笨蛋一样认为c + 类== c++ ●Q:TC,VC,BC,BCB是什么?有什么区别?谁好? ●A:它们都是开发C/C++的开发环境,是软件。它们是不同时期由不同公司 发行的软件Turbo C ,Borland公司在八十年代末期发行的C语言的开发环境Turbo C++,Borland公司在八十年代末九十年代初发行的C++语言的开发环境Visual C++,Microsoft公司在九十年代至今发行的C/C++开发环境Borland C++,Borland公司在九十年代中发行的C/C++开发环境Borlan C++ Builder,Borland公司在九十年代后期至今开发的C/C++开发环境,与其他开发环境不用的是它属于快速应用程序开发(RAD),可以让你不写代码就能建立程序,当然它的运行效率见仁见智没有什么是万能的,不同场合用不同的东西而且C/C++还有很多开发环境,譬如gcc,watcom C++,Dev C/C++ ●Q:什么语言/开发环境最好? ●A:没有最好,只有最适用某方面 ●Q:需要什么基础才能学C/C++ ●A:至少学过幼儿园语文,小学英语,小学数学才能学,所以先确定你拥有 小学学历,然后就能学了至于学习C++前是否需要学C,C++的发明者认为不用,但见仁见智 ●Q:如何更有效的学习C/C++? ●A:不断的看书+实践,先把书上的练习题做完再说,务必记住不要钻牛角尖, 很多初学者经常犯这样的错误,不要盲目的提出问题,现在看来是问题其实在以后的实践和学习中都会慢慢理解的,任何东西都需要一个过程。万万不可浮躁。 ●Q:TC能开发windows软件吗? ●A:不能,因为不同系统,生成的程序格式不同 ●Q:要多久才能成为高手? ●A:当你不再问这个问题的时候,总是会有比你技术高的人,也许你在你生 活的环境中没有,的确可以说你在这个小范围是高手,但是再在别的地方一定会有比你厉害的人只是你没有接触到而已 ●Q:学C/C++有什么用? ●A:先想想你为了什么而学,想不到就不要学 ●Q:学完C/C++又能怎样 ●A:没怎样,学是为了使用服务的,只证明你会一门语言,但不等于你会开 发软件。就像学外语,为的是跟外国人交际,但如果你不懂交际,即使精通英语,法语,日语,朝鲜语,阿拉伯语,西班牙语……还是不会跟人交际。 你应该继续学习软件开发的知识,包括数据结构,算法,软件工程等等,还有要提高数学水平,譬如微积分,离散数学,矩阵,概率,统计,数值分析。 ●Q:我有很多不懂,怎么办? ●A:查帮助,搜索引擎。最著名的帮助文档叫MSDN,我们主要使用其光盘发 行版,D版可以从电脑城买,正版可以去微软订购,如果没有光盘可以去https://www.360docs.net/doc/842806156.html,查询。 ●二、开始学习了 ●Q:我在TC看到缺少cos.obj的提示,为什么?

“英语”语言学概论第六章笔记

Chapter 6 Pragmatics 语用学 1.What is pragmatics? 什么是语用学? Pragmatics can be defined as the study of how speakers of a language use sentences to effect successful communication. As the process of communication is essentially a process of conveying meaning in a certain context, pragmatics can also be regarded as a kind of meaning study. It places the study of meaning in the context in which language is used. 语用学研究的是说某种语言的人怎样用句子去实现成功的交际。 由于交际的过程从本质来说是在一定的语境中表达意义的过程,因而语用学的本质是一种意义研究。它是一种将语言置于使用的语境中去的意义研究。 2.Pragmatics and semantics 语用学和语义学 Pragmatics and semantics are both linguistic studies of meaning, but they are different. What essentially distinguishes semantics and pragmatics is whether in the study of meaning, the context of use is considered. If it is not considered, the study is restricted to the area of traditional semantics; if it is considered, the study is being carried out in the area of pragmatics. 语用学和语义学都是对意义的语言学研究,但两者是不同的。它们的本质区别在于研究意义时是否考虑了语言使用的语境。没有考虑到语境进行的研究就没有超出传统语义学的研究范围;相反,考虑到语境进行的研究就属于语用学的研究范围。 3.Context 语境 Context is essential to the pragmatic study of language. It is generally considered as constituted by the knowledge shared by the speaker and the hearer. 语境是语言的语用研究中不可缺少的概念。它一般被理解为说话者和听话者所共有的知识。The shared knowledge is of two types: the knowledge of the language they use, and the knowledge about the world, including the general knowledge about the world and the specific knowledge about the situation in which linguistic communication is taking place. 共有的知识包括他们所使用的语言方面的知识和双方对世界的认识,包括对世界的总的认识和对正在进行的语言交际所处的环境的具体认识。 4.Sentence meaning and utterance meaning 句子意义和话语意义The meaning of a sentence is abstract, and de-contextualized, while utterance meaning is concrete, and context-dependent. Utterance is based on sentence meaning; it is the realization of the abstract meaning of a sentence in a real situation of communication, or simply in a context. 句子的意义是抽象的,非语境化的,而话语的意义是具体的,受语境制约的。话语意义基于句子意义;它是一个句子的抽象意义在特定语境中的具体体现,或简而言之,在一个语境中的具体化。 5.Speech act theory 言语行为理论 Speech act theory is an important theory in the pragmatic study of language. It was originated with the British philosopher John Austin in the late 50’s of the 20th century. 言语行为理论是语言语用研究中的一个重要理论。它最初是由英国哲学家约翰.奥斯汀在20世纪50年代提出的。 According to speech act theory, we are performing actions when we are speaking.

普通语言学教程笔记(索绪尔)

《普通语言学教程》索绪尔 绪论 第一章语言学史一瞥 语法(规范)-语文学(过于注重书面语)-比较语文学或比较语法(只比较)-新语法学派(语言集团集体精神的产物) 第二章语言学的材料和任务;与毗邻科学的关系 语言学的任务是:a 对一切能够得到的语言进行描写并整理他们的历史,尽可能重建每个语系的母语;b 寻求在一切语言中永恒地普遍地起作用的力量,整理出能概况一切历史特殊现象的一般规律;c 确定自己的界限和定义。它与社会心理学、生理学、语文学相关。语言学也有实际用途,特别是对于那些利用文献的人,另外对一般修养也很重要。 第三章语言学的对象 定义——在任何时候,语言都是现行制度和过去的产物。我们的研究方法是一开始就站在语言的阵地上,把它当做言语活动的其他一切表现的准则。语言和言语活动不能混为一谈,它只是言语活动的一个确定的部分,而且当然是一个主要部分,它既是言语机能的社会产物,又是社会集团为了使个人有可能行使这机能所采用的一整套必不可少的规约。语言本身是一个整体,一个分类的原则。它是一种约定俗成的东西,人们同意使用什么符号,这符号的性质是无关轻重的。对人类天赋的不是口头的言语活动,而是构成语言——即一套和不同的观念相当的不同的符号——的机能。人们说话的机能——不管是天赋的或非天赋的——只有借助于集体所创造和提供的工具才能运用,所以,说语言使言语活动成为统一体,绝不是空想。 语言在言语活动事实中的地位——言语循环重建:心理现象-生理过程-物理过程-生理过程-

心理现象 (c-i)这一主动过程称为执行部分,(i-c)这一被动过程称为接受部分,此外还有联合和配置的机能。语言是社会的、主要的,言语是个人的、偶然的、从属的。 语言的特征是:1 他是言语活动事实的混杂的总体中的一个十分确定的对象,是言语的社会部分。2 语言是人们能够分出来加以研究的对象。3 言语是异质的,而规定下来的语言是同质的,它是一种符号系统,在系统中,只有意义和音响形象的结合是主要的,符号的两个部分都是心理的。4 语言这个对象在具体性上比言语毫不逊色。即是音响形象的堆叠,又可转为文字。 语言在人文事实中的地位:符号学——语言是一种表达观念的符号系统。符号在本质上是社会的。 第四章语言的语言学和言语的语言学

语言学概论整理

语言学概论 第一章、绪论 1.语言学定义:专门以语言为研究对象的一门独立的科学。语言学的任务就是研究语言的性质、功能、结构及其运用等问题,揭示语言存在和发展的规律,使人们理解并掌握语言的理性知识。 第一节、语言研究与语言学 1.神话传说 2.语文学研究 ①语文学:是从文献角度研究语言文字学科的总称。它以文献评审为主,目的在于解释、 注疏和考订。 ②东方语言学:古印度、古中国 古印度语言学:公元前4、5世纪时,口语和《吠陀》时代的语言差别越来越大,甚至许多地方已经不能为一般人所读懂了。为了确保准确无误地理解《吠陀》的宗教内容,就必须对《吠陀》的语言作注释。著名的《巴尼尼经》(Pāninisūtra)正是当时从解说《吠陀》语言开始,进而研究梵语的整个结构的产物。《巴尼尼经》又名《八章书》,是巴尼尼在前人研究的基础上撰写的一部梵语语法。巴尼尼用3,983条经句极其概括地叙述了梵语的语音结构、语词的构成和变化规则。巴尼尼语法是一部汇集了许多世纪的语法学家研究成果的语法法典,对梵语的语音、语法现象分析和描写得十分细致,代表了古代印度语言研究的水平。印度语言研究的最初动力,是必须把梵语文化中最古老的吠陀时期由口头流传下来的一些宗教和礼仪文献保存下去,巴尼尼的工作在一定程度上帮助了后人学习和研究梵语。布龙菲尔德说:巴尼尼的著作是“人类智慧的丰碑之一”。 ③西方语言学:古希腊语言学、古罗马语言学、中世纪至18世纪末的西方语言学 谈谈语文学和语言学的关系: 语言学就是专门以语言为研究对象的一门独立的科学。语言学的任务就是研究语言的性质、功能、结构及其运用等问题,揭示语言存在和发展的规律,使人们理解并掌握语言的理性知识。语言学还没有成为一门独立的学科之前,人们对于语言的学习和研究只是为了给古代经典文献作注释,我们称那段时期的语言研究为语文学。语文学是从文献角度研究语言文字学科的总称。它以文献评审为主,目的在于解释、注疏和考订。 3.历史比较语言学:威廉琼斯的论文拉开19世纪历史比较语言学研究的序幕 4.现代语言学: ①瑞士语言学家索绪尔的《普通语言学教程》 索绪尔:现代语言学的历史,是从瑞士语言学家费尔迪南·德·索绪尔开始的。索绪尔的代表作是《普通语言学教程》。索绪尔被誉为“现代语言学之父”,《普通语言学教程》是现代语言学的奠基之作。索绪尔的语言学思想和19世纪以前的语文学最根本的区别在于:把语言看成是由各个符号之间的关系组成的有价值的结构系统。 《普通语言学课程》是一部什么样的书? 《普通语言学教程》是由索绪尔的两位弟子兼同事根据学生们的听课笔记整理而成的。《普通语言学教程》是现代语言学的奠基之作。索绪尔区分了语言和言语,语言属于全社会,是抽象的;言语属于个人,是具体的。索绪尔认为语言是符号系统,“是一个纯粹的价值系统”。每个符号是由“能指”和“所指”构成的,所指和能指之间的关系是任意的。符号之间存在着线性的句段关系和联想的聚合关系。索绪尔把语言现象分为“共时”和“历时”两种,“共时”是指时间历程中的某一点上的语言状态,“历时”是指以时间历程中的某一点到以后的语言现象。索绪尔认为,语言学的对象是语言,由于语言有它的内部要素,也有它的外部要素,所以语言学也可以分为内部语言学和外部语言学。总之,《普通语言学教程》的语言学

汇编语言入门

汇编语言入门教程 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS 的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。 内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可存放

《普通语言学教程》读书笔记

《普通语言学教程》读书笔记 10级汉语3班徐星星100322 本书著者是本世纪最著名、影响最深远的语言学家之一费尔迪南·德·索绪尔,在本书中,他对欧美语言学界所接触到的各种有关原理和方法的问题都作了总结,并且提出了自己独到的见解。这本书的影响也遍及世界。 首先在绪论的第三章中,索绪尔向我们阐释了语言的定义: 语言是一种约定俗成的东西,人们同意使用什么符号,这符号的性质是无关轻重的。即一套和不同的观念相当的不同的符号。人们说话的机能只有借住集体创造和提供的工具才能运用,不管是天赋的或非天赋的。所以说,说语言使言语活动成为统一体,那绝不是什么空想。在索绪尔看来。语言是语言共同成员中的语法体系,言语则是人们平时说的那些话,是依赖于语法系统的说话行为。言语是语言的体现。语言学研究实际语言行为中所潜藏的形式系统,因此,在索绪尔看来,语言学的对象是语言而不是言语。 索绪尔认为,把语言和言语分开,我们就把什么是社会的,什么是个人的,什么是主要的,什么是从属的和偶然的区分开来了。照此看来,语言学家主要的研究对象应该是“语言”、确定构成“语言”的单位及其组合规则,而不是去描写言语活动。“语言”是一个符号的系统,在这个系统中,只有意义和音响的形象的结合是主要的。 索绪尔为了确立语言学的研究对象,区分出“语言”和“言语”,他的“语言”和“言语”理论不仅对本世纪的语言研究的方法产生了深刻的影响,而且还影响着文学和符号学研究。 在第一编中,索绪尔指出语言是一个符号系统。语言是符号学的一部分,他强调语言具有一般符号系统的主要特征。语言与其他一切同类的的符号系统有以下几点共同点。一是目的相同,各种符号系统虽然采用的手段不同,复杂程度不同,但目的都是一样的,都是为了传递信息。二是它们的内涵相同,一切符号系统之所以能传递信息是因为它们与意义相联系。意义是符号的内涵,是符号在使用该系统的人在头脑中激发的概念。三是构成元素相同,无论使用

语言学概论 精讲一官方笔记

语言学概论第一节课官方笔记目录 一、课件下载及重播方法 二、本章/教材结构图 三、本章知识点及考频总结 四、配套练习题 五、其余课程安排 一、课件下载及重播方法 二、教材节构图

三、本章知识点及考频总结 第一部分语言和语言学 ◆模块一认识人类的语言 知识点一语言的性质和类型 (一)语言的概念 语言是一种符号系统,是由语音和语义构成的符号系统,是人类进行社会交际和思维认知的工具。 (二)人类语言与其他动物鸣叫系统的区别是: 1、内容更多: 表达无极限(时间、空间),想说、可说、能说。 2、用处更大: 交际、标志、记录、思维、认知等功能。 3、能够创造: 极强的生成能力和极高的运转效率。

注意:只有人类才有语言人类具有语言能力,是人跟其他动物区别的最重要的标志 (二)语言和民族、国家的关系 确定不同的语言,首先涉及的是语言跟民族和国家的关系 1.语言是识别民族和国家的标志——“相互能够听懂”(欧洲国家) 相同民族——相同语言;同一国家——同一语言 2.语言并非识别民族和国家的标志(欧洲以外的国家) 犹太人的语言与民族身份;海外华人的民族身份与语言;满族与满语 3.西方学界的双重标准——“相互能够听懂” 弱国——用语言识别民族;对“汉语”的看法。 强国——不用语言识别民族,美国、英国、澳大利亚和加拿大 (三)语言的特点和语言类型 1、语言的特点 不同的语言有自己的特点,各种语言在语音、词汇、语法方面差距显著。根据语言的特点,把语言进行分类,主要有“语言的谱系分类”和“语言的形态分类” 2、语言的类型 (1)语言的谱系分类

从语言的“历时”角度划分不同的语言,建立“语言的谱系分类”, 即语言的亲属关系分类。根据各种语言在语音、语汇、语法等方面是否有共同的来源和相似性的大小对语言进行的分类。 谱系分类是一个层级系统:语系—语族—(语支)—语言—方言—次方言(土语) 语系:语系是谱系分类中最大的类,语系、语族、语支、语群这种谱系分类的层级体系,反映了原始基础语随着社会的分化而不断分化的历史过程和结果。 世界上的语言大致分为七、八个语系。印欧语系和汉藏语系(区别在于是否有区分意义的声调和词的形态变化)语族:语系的下一级叫语族,同一语族的语言不但有相同的来源,相似点也更多,如印欧语系下分印度语族、伊朗语族、日耳曼语族等。 (2)语言的形态分类 即语言的结构类型分类。主要分为两种: ①形态语(综合性语言) 通过词的形态变化来体现各种结构意义的语言,主要有屈折语(词的形态变化丰富,如德语、俄语)、黏着语(词的形态变化为前后词缀,如维吾尔语、日语) ②孤立语(分析性语言)——汉语 语法手段无需谓词词形变化表现“时、体、态”;无需

汇编语言基本关键字

汇编语言基本关键字 aaa对非压缩BCD码加法之和调整 aas 对非压缩BCD码减法之差调整 aam乘法调整aad被除数调整 add不带进位标志位的加法adc带进位标志位的加法 and逻辑与 assume指定段寄存器 bswap双字单操作数内部交换 bt位测试bts位测试并置一 btr位测试并清零btc位测试并取反 bsf/bsr正,反向位扫描 call调用 cbw字节转换为字cwd字转换为双字cwde字转换为扩展的双字cdq双字转换为四字 cmp比较cmpxchg比较并交换 cmps串比较 code定义简化代码段 const定义简化常数数据段 daa对压缩BCD码加法之和调整das对压缩BCD码减法之差调整 data定义简化数据段 db/dw/dd/dq/dt定义字节/字/双字/四字/十字变量 dec减一

df定义32位便宜地址的远地址指针 div无符号数除法 equ等价textequ文本等价 even取偶偏移地址 fardata,fardata定义简化独立数据段 group定义段组 idiv有符号整数除法 imul有符号整数乘法 in输入 inc加一 ins/outs输入/输出串元素 jcxz/jecxz若cx=0/ecx=0,跳转 jmpdopd无条件跳转到DOPD 处取出指令继续执行 label为$定义符号 Lahf 标志位低八位送AH lea 偏移地址送通用寄存器lda传送进入数据段的地址指针 les传送进入附加数据段的地址指针lfs传送进入FS段的地址指针lgs传送进入GS段的地址指针lss传送进入堆栈段的地址指针 local说明局部变量 lods读出串元素 Loop/loopd无条件循环cx/ecx为循环次数 loopnz/loopnzd非零或不等时循环,cx/ecx为循环次数

C语言从入门到精通所需的7本书

C语言从入门到精通所需的7本书 作者:王霸羔子 1.C primer plus C primer plus作为一本被人推崇备至的c入门经典,C primer plus绝非浪得虚名。应该算得上C教材里最好的入门书了。 在知识广度上,很少有书能匹及。它能为你系统学习c提供一个良好的平台。作者对c 的见解精辟。在娓娓叙述的同时,作者辅以大量程序以分析。它让我对C有了更加系统的全新认识。决非国人所写的那些公理化的教条说教,我觉得作者把自己的心血全部吐露。书很厚,近700页,却不没有让我觉得任何的烦琐。甚至是兴趣盎然。我把上面所有的课后题目都做了。 最为重要的是,看完这本书后,我再也不觉得c很高深枯燥无味了。如果你问我,你最大收获是什么。我会告诉你,兴趣! 2.The C programming language

拿到这本薄薄的书,很多人开始怀疑,C语言是这么几百页能讲清楚的么。看完这本书,我想答案已经很明了,却真的让人感到震憾。什么是好书?无法删减的书才是真正的好书。 K&R的书一如C语言的设计理念:简单而高效里面的习题建议都认真做一遍,而且是在linux下用vi来做,用makefile来编译,用shell脚本来进行测试,本来第八章的题就是和linux 相关的计算机的大学生们不应只会在WINDOWS下用VC来编程,而都应该在linux环境下进行程序设计,因为linux本身就是为开发者准备的操作系统。 3. C和指针 这本书最大的特点就是和指针结合在一起进行讲解,通过一些经典的C例题对所学的知识进行巩固,对指针的基础和深入的探讨,有助于初学者更好的理解C语言,还有明白C 的存储机制。我之前买了《C语言详解》和《C Primer Plus》结合这本书一起学习,可以说是完美的,希望每个热爱C语言的人能够拥有这本书。 我在这里推荐给所有想学好C语言的朋友! 4.C专家编程

《语言学纲要》(叶蜚声_徐通锵)详细复习资料_课堂讲义笔记

语言学纲要讲义笔记 导言 一、语言的定义 语言是人类最重要的交际工具和思维工具、是由音义结合的词汇和语法构成的一种符号系统。 二、语言学的对象和任务 语言学是研究语言的科学。 要把语言学跟语文学区分开来 中国传统语文学——“小学” 小学是我国古代语文学的统称,由训诂学、文字学、音韵学三部分组成。 在古印度,公元前4世纪,著名学者潘尼尼在整理、注释婆罗门教经典《吠陀》时,写了一本《梵语语法》,提出3996条规则,被人们称为最完备的语法书。在古希腊,伯拉图和亚里斯多德是从哲学的角度来研究语言的,他们讨论了词为什么具有意义等内容。 三、语言学在科学体系中的地位 语言学既是一门古老的科学,又是一门年轻的科学。 1、与社会科学、自然科学的联系 语言研究的成果是哲学、历史学、考古学、文学、政治学、经济学、逻辑学、社会学、民族学、计算机科学等学科所必须利用的,可见语言研究在这些社会科学中已占重要地位。 语言学与其他学科相交叉产生社会语言学、心理语言学、计算语言学、生物语言学、模糊语言学、实验语音学等。如:运用语言传递信息的过程,可分为五个阶段: 编码——发送——传递——接收——解码 对这一具体过程的解释需要结合物理学、生理学、心理学等其他学科的知识。三、语言学的基本类别 总体上,根据研究对象的不同,语言学可以分为理论语言学和应用语言学两大类。(一)理论语言学可分为: 1、一般/普通语言学

2、个别/具体语言学 具体语言学 (1)历时语言学 (2)共时语言学 (二)应用语言学 1、社会语言学:研究语言与社会集团的关系。如地域方言、社会方言、语言的接触、语言规划等。 2、心理语言学:研究儿童语言习得、语言的接收和发生过程,等。 3、神经语言学 最近二十年才从心理语言学中分离出来的一门新的学科,主要研究语言和大脑结构的关系,中心是大脑如何生成语言。 此外,还有数理语言学、统计语言学、实验语音学等。 第一章语言的功能 第一节语言的社会功能 一、语言的信息传递功能 信息传递功能是语言的最基本的社会功能。 人类还借助语言之外的其他形式传递信息,它们是文字,旗语,信号灯,电报代码,数学符号,化学公式等等。 身势等伴随动作等是非语言的信息传递形式。 身势等非语言的形式多半是辅助语言来传递信息; 文字是建立在语言基础之上的最重要的再编码形式; 旗语之类是建立在语言或文字基础之上的再编码形式; 语言是人类社会信息传递第一性的、最基本的手段,是最重要的交际工具。二、语言的人际互动功能 语言的社会功能的另一个重要方面是建立或保持某种社会关联,这就是语言的人际互动功能。互动包括两个方面:一个是说话者在话语中表达自己的情感、态度、意图,另一方面这些又对受话者施加了影响,得到相应的语言或行动上的反馈,从而达到某种实际效果。

语言学概论00541史上最全(吐血整理) 汇总 简单题+名词解释 小抄笔记

27.书面语:书面语是用文字记录的语言形式,它是文字产生或在口语的基础上产生的,书面语是经过加工、提炼和发展了的口语的书面形式。 26.口语:就是有声的口头语言,任何一种语言都有口头存在形式。它是书面产生的基础。 28.语言相关论:语言相关论是萨丕尔和沃尔夫提出的关于语言与思维关系的观点,主张语言决定思维,不同的语言就有不同的思维方式。 29.大脑语言功能临界期:大脑语言功能临界期是指大脑的单侧化,大脑左半球的分区以及语言的遗传机制,都只提供人具有语言能力的潜在可能性,这些潜能必须在一定期限内被一定的语言环境激活才可能起作用。26.语言符号的所指 :语言符号的所指是符号的形式所指的意义内容。 29.机器翻译:通过计算机把一种语言自动翻译成另一种或多种自然语言的信息处理技术。 26.语音:语音是人的发音器官发出的、用于人与人之间交际并表达一定意义的声音。 27.词:词是最小的、有意义的、能够独立运用的语言单位。 28.语用:语用指语言运用,即人们在一定的交际环境中对语言的实际运用。 29.文字:文字是记录语言的书写符号系统。 27.单纯词:单纯词是由一个构词语素构成的词。 29.屈折:屈折是通过词的内部发生语音的交替变换来改变词的语法意义的手段。 28.意译词:是用本族语言的构词材料和规则构成新词,把外语中某个词的意义翻译过来。 27.仿译词:是用本族语言的语素逐个对译外语原词的语素造成的词,它不仅把原词的词义翻译过来,而且保持了原词的内部构成方式。 29.主谓词组:两个成分之间具有被说明和说明关系的词组是主谓词组。 27.复辅音:一个音节内处于同一个肌肉紧张的渐强阶段或渐弱阶段上的两个或两个以上辅音的组合。 27.双语现象:某一言语社团使用两种或多种语言的社会现象,具体而言是社团内的全体成员或部分成员双语并用的现象。 28.亲属语言:从同一种语言中分化出来的各个语言叫亲属语言,亲属语言之间具有历史同源关系。 26.调位:利用音节内的音高差别来起辩义作用的语音单位叫做调位,调位是一种非音质音位,依附在音位的组合序列上。 29.词组:实词与实词之间具有直接联系的相对独立的词群。 28.语素:语素是语言中音义结合的最小单位。 28.词尾:附着在词干后的,能改变词的语法形式,但不能构成新词的语素。 29.语素:音义结合的最小语言单位。 26.词类:词类是词在语法上的分类。它指可以替换出现在语法结构某些共同组合位置上的词的类,即具有聚合关系的词的类。 27.词法:(1)词法主要描写词的形态特征和词形变化规则。例如,俄语的名词在形式上有单数和复数的区别,有阳性、阴性、中性等性的区别,有主格、宾格、属格等格的区别,这些都是典型的词法现象。(2)由于印欧语言中构词单位、构词方式和词类都与词的形态变化相关,因此构词和词类问题也成为词法的一部分。27.语法意义:语法意义是语法形式所体现的意义,是语言中通过一类形式或功能所获得的意义。二者相辅相成,不可分离。如“动词+名词”有动宾关系的意义,汉语所有的同类组合都是如此,这种意义就是一种语法意义。 27.语法形式:语法形式就是能体现表达某种语法意义的形式。表示某一类语法意义或者有共同作用的形式,如词类形式、组合形式、虚词形式,就是语法形式。语法形式不是个别的语音形式和词语形式,但能产生某一类意义或者有共同作用的语音表现形式或者词形变化形式也是语法形式。 27.语法手段:根据语法形式的共同特点所归并的语法形式的基本类别叫做语法手段。语法手段可分为词法手段和句法手段两大类。通过词形的变化来表现语法意义的形式是词法手段;通过结构的变化来表现语法意义的形式是句法手段;例如英语名词后加s表示复数,英语动词后面加ed表示过去时,就是词法手段中的词形变化。 28.自源文字:自源文字指独立发展起来的文字。如古埃及文字、苏美尔文字、汉字,这些文字的形体、体系都是由最早使用该文字的人们独创的。 29.语音合成(1)语音合成是语音信息处理研究中的主要工作。 (2)语音合成就是让计算机模拟人的发音器官的动作并发生类似的声音。如汉语的语音合成目前已初步实现自动生成声韵调结合的音节。 26.句子:句子是词或词组按一定规则组合成的、能表达相对完整的意义、前后有较大停顿并带有一定的语气和句调的语言单位。 27.异化:语流中两个相同或相近的音,其中一个因受另一个影响而变得不相同或不相近。

汇编语言基础知识

汇编语言基础知识 汇编语言是直接在硬件之上工作的编程语言,首先要了解硬件系统的结构,才能有 效地应用汇编语言对其编程,因此,本章对硬件系统结构的问题进行部分探讨,首先介绍了计算机的基本结构、Intel 公司微处理器的发展、计算机的语言以及汇编语言的特点,在此基础上重点介绍寄存器、内存组织等汇编语言所涉及到的基本知识。 1.1 微型计算机概述 微型计算机由中央处理器(Central Processing Unit ,CPU )、存储器、输入输出接口电路和总线构成。CPU 如同微型计算机的心脏,它的性能决定了整个微型计算机的各项关键指标。存储器包括随机存储器(Random Access Memory ,RAM )和只读存储器(Read Only Memory ,ROM )。输入输出接口电路用来连接外部设备和微型计算机。总线为CPU 和其他部件之间提供数据、地址和控制信息的传输通道。如图1.1所示为微型计算机的基本结构。 外部设备存储器输入输出接口电路中央处理器 CPU 地址总线 数据总线 控制总线 图1.1 微型计算机基本结构 特别要提到的是微型计算机的总线结构,它使系统中各功能部件之间的相互关系变 为各个部件面向总线的单一关系。一个部件只要符合总线结构标准, 就可以连接到采用这种总线结构的系统中,使系统功能得到扩展。 数据总线用来在CPU 与内存或其他部件之间进行数据传送。它是双向的,数据总线 的位宽决定了CPU 和外界的数据传送速度,8位数据总线一次可传送一个8位二进制数据(即一个字节),16位数据总线一次可传送两个字节。在微型计算机中,数据的含义是广义的,数据总线上传送的不一定是真正的数据,而可能是指令代码、状态量或控制量。 地址总线专门用来传送地址信息,它是单向的,地址总线的位数决定了 CPU 可以直接寻址的内存范围。如 CPU 的地址总线的宽度为N ,则CPU 最多可以寻找2N 个内存单 元。

索绪尔及其《普通语言学教程》之心得

费迪南德?德?索绪尔(Ferdinand de Saussure,1857-1913)是现代语言学的创始人。他是一位杰出的语言学家。作为一门新兴人文学科的开创者,他对语言哲学的影响也极为广泛深刻。 索绪尔出生于日内瓦,父亲是一位科学家。他从小受到自然科学的教育,同时也得到良好的语言教育和语言学教育,掌握法语、德语、英语和拉丁语,初通梵文。15岁时就写了一篇《语言论》。曾于日内瓦大学和莱比锡大学,研习物理、化学和希腊文。莱比锡大学当时是新语法学家的中心,在那的学习大致确定了索绪尔后来以语言学为业的道路。也就在这个时期,他发表了他的第一篇重要论文,《论印欧系语言中原因的原始系统》,引起学术界的重视,而那时他才年仅21岁。获得博士学位后,索绪尔移居巴黎,在高等研究学院讲授梵文、哥特语、古高地德语以及印欧语文学概况。1891年,他开始到日内瓦大学任教。日内瓦与巴黎的学术研究相比相对滞后。索绪尔穷究一生,不带任何传奇色彩。他在世时只是著名的语言学家,但他作为一个哲学家的地位,却是直到他死后才为人们所认可的。 索绪尔生前只发表过很少几篇相当专业的论文。1907-1911年期间,他在日内瓦大学担任普通语言学课程的教学。1913年他去世以后,他的学生和同事根据几本听课笔记才汇编成《普通语言学教程》一书,出版发行。索绪尔不仅吝于发表,他留下的笔记也很少,因此编辑这本书很不容易。因为,跟所有的老师一样,他讲课时也是有很多重复,甚至不一致的内容。难得的是编辑者们没有放弃,合并梳理成一本书,从而造就了一部惊世巨著。 《普通语言学教程》这部著作主要由绪论和附录两部分组成。绪论部分主要阐述了索绪尔对于语言系统的看法。索绪尔认为语言系统具有自主性和形式化这两个特点。他把语言现象划分为“内部要素”和“外部要素”两部分,并以此作为语言研究的前提。“内部要素”是指语言系统内符号与符号之间所形成的相互制约、相互对立的关系;“外部要素”则是指与语言有间接关系的政治、经济、文化、宗教、地理、历史等社会因素。因为索绪尔认为“内部要素”与“外部要素”之间无联系,且进行语言研究必须建立起一个界限清晰的“语言系统”。所以,他说:“我们关于语言的定义是要把一切跟语言的组织、语言的系统无关的东西,简言之,一切跟我们用‘外部语言学’这个术语所指的东西排除出去。”另外,索绪尔还阐发了“语言符号的价值决定于语言系统整体性质”的观点,并将此观点以及上面所提及的观点合在一起,共同支撑起关于语言系统具有自主性的说法。实际上,此举的真正目的是为语言学的研究对象下定义,且以此厘清语言和言语之间的关系。 语言是言语行为的社会部分,是个人被动地从社会接受而储存于头脑中的系统。它存在于个人意志之外,是社会每个成员共同具有的,是一种社会心理现象。言语是言语行为的个人部分,是个人对语言系统的运用。语言和言语紧密相连,互为前提。个人要说话使人理解,必须用语言,同时语言的存在又必须体现在言语当中,而且,使语言发生变化的也是言语。所以,语言既是言语的工具,又是言语的产物,但“这并不妨碍它们是两种绝对不同的东西” 在对语言学进行概述之后,《普通语言学教程》的附录部分进一步详细叙述了索绪尔的音位观、符号观以及结构主义研究方法论。他认为语言可为语音符号和文字符号,语音由心灵激活而被赋予意义,文字则只是语音的无生命的、随意的、可有可无的替代物。在符号观中,索绪尔对符号的“任意性”和“线条性”展开阐述,并且重点论述了符号的“不变性”与“可变性”特点。由此他不但揭

相关文档
最新文档