当前位置:文档之家› C语言学习笔记

C语言学习笔记

C语言学习笔记
C语言学习笔记

编程规则

函数变量定义

数据的传递尽量通过函数的参数来实现,函数前面的函数返回值类型最好是表示函数执行的状态。

比如:我们通过串口接收一个字节数据,我们可以定义函数如下:

BOOL

xSmsPortSerialGetByte( CHAR * pucByte )

{

*pucByte = UDR;

return TRUE;

}

还可以定义如下:

Char xSmsPortSerialGetByte( void)

{

return UDR;

}

第一种方法,调用函数后需要传递出一个接收到的数据,这个是通过函数的参数来传递的。第二种方法,是通过函数的返回值来传递的。

编译

代码编译后不能存在warning。

以后一定注意不能忽略编译器的警告

发表于2008-7-13 22:54:25

1,为什么容易忽略编译器的警告信息?

1)编程时处理各种error已经很让人恼火的了,error自然被放在次要位置;

2)绝大多数下,程序在存在warnings的情况下,在短期内可以正常运行,我们根本看不到错误,导致warning近一步被轻视;

3)没有养成好的工作习惯,带有warning的代码是不能交付的,而我们判断交付的标准中往往没有对代码提出更为细致的要求。

2,忽视编译警告往往会给我们造成重大损失

最近的一个项目中,我的程序在实验室测试了1个星期没有出现问题。当设备部署到现场3天后,坏事情终于发生了:设备依次出现死机问题。

再从头分析代码,百思不得其解,痛不欲生的时候注意到了一个编译警告,说一个表达式一直为真。原来发生了下面的错误:

unsigned char i;

for( i = 0; i < 1000; i++) {.....}

变量类型的定义导致了表达式一直为真。为什么开始的测试中不会出现问题哪?原来,这段代码是必须程序运行一段时间后才会执行的一段代码,在短时间的测试中根本不会进入。

看来编程真不能偷懒,偷懒必遭惩罚,你还要费比当时偷懒省的劲多好多倍的劲来弥补,并且这个弥补的过程中你还要承受巨大的压力。跟平时多流汗战时少流血的道理一样的。

3)解决办法

给自己的编程增加一个规则,带有编译警告的代码不能交付。

引用没有声明的外部函数可能会导致严重问题

using a function without a valid prototype is VERY dangeours.

在一个函数中调用另外一个文件中定义的函数,但是这个函数没有进行声明,会出什么问题哪?

大多数的情况下可能会出现问题,有些情况下,可能是幸运不会出现问题。

看下面这段代码:

unsigned long ulWater_Max_Value=0xABCDEFUL;

Puthexbyte(ulWater_Max_Value>>24);

Puthexbyte(ulWater_Max_Value>>16);

Puthexbyte(ulWater_Max_Value>>8);

Puthexbyte(ulWater_Max_Value);

其中Puthexbyte函数在另外一个c文件中进行了定义,但是在该文件对应的. h文件中,我没有对这个函数进行声明。

这样,当运行上面的代码的时候,会导致错误的结果,输出的数据全部为0。

改正的方法是,为每个外部函数在.h文件做一个相应的声明。每个需要调用这个函数的文件都要包含这个.h头文件。

仍然是上面的代码,如果把变量定义为unsigned int 形式,却可以输出正确结果。这有点奇怪,绝对是侥幸,但是,为什么会对哪?即:

unsigned int ulWater_Max_Value=0xABCD;

//Puthexbyte(ulWater_Max_Value>>24);

//Puthexbyte(ulWater_Max_Value>>16);

Puthexbyte(ulWater_Max_Value>>8);

Puthexbyte(ulWater_Max_Value);

在不声明Puthexbyte函数的情况下,仍然能正确输出,为什么哪?

assert(断言)的使用

编辑: 程序设计发表日期: 2007-05-13 21:56

原创作者:Qdieyou,转载请加注。

程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。(这个概念可能不大好理解,想想VC下,调试时有个选项,一个是debug,一个是release)

assert(表达式); 的意思是:当表达式为真时,程序继续运行,如果表达市为假,那程序就会停止运行,并提示错误信息。

注意:assert是一个宏,只在debug版本中起作用,在release版本中,该语句是不起任何作用的。

先简单的看一个例子吧!

以下为一个使用了断言的C源程序:

#include

#include

void test(int *p)

{

assert(p != NULL);

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

}

int main(void)

{

test(NULL);

}

编译及运行结果:

Qdieyou@qdieyou /cygdrive/e/gcc

$ gcc -o assert assert.c

Qdieyou@qdieyou /cygdrive/e/gcc

$ ./assert

assertion "p != NULL" failed: file "assert.c", line 6

19331 [sig] assert 3288 e:\gcc\assert.exe: *** fatal error - called with threa

dlist_ix -1

Hangup

程序说明:由于我们在main函数中传了NULL指针值给test函数,在test函数执行到assert(p != NULL);发现表达式不为真,就终止了程序的运行,并提示错误的行数信息。

注意:由于assert宏只在debug版本中起作用,所以assert一般只用于内部函数对参数有效性进行检查,如果该函数作为一个外部接口来使用时,一般需要利用if,else语句进行防错设计。——Qdieyou

以下摘自《C高效编程》

【规则6-5-1】使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。

【规则6-5-2】在函数的入口处,使用断言检查参数的有效性(合法性)。

【建议6-5-1】在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。

【建议6-5-2】一般教科书都鼓励程序员们进行防错设计,但要记住这种编程风格可能会隐瞒错误。当进行防错设计时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。

编程的时候,看到下面的一个函数:

eMBErrorCode

eMBASCIIReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength ) {

eMBErrorCode eStatus = MB_ENOERR;

ENTER_CRITICAL_SECTION( );

assert( usRcvBufferPos < MB_SER_PDU_SIZE_MAX );

/* Length and CRC check */

if( ( usRcvBufferPos >= MB_SER_PDU_SIZE_MIN )

&& ( prvucMBLRC( ( UCHAR * ) ucASCIIBuf, usRcvBufferPos ) == 0 ) )

{

/* Save the address field. All frames are passed to the upper layed

* and the decision if a frame is used is done there.

*/

*pucRcvAddress = ucASCIIBuf[MB_SER_PDU_ADDR_OFF];

/* Total length of Modbus-PDU is Modbus-Serial-Line-PDU minus

* size of address field and CRC checksum.

*/

*pusLength = ( USHORT )( usRcvBufferPos - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_LRC );

/* Return the start of the Modbus PDU to the caller. */

*pucFrame = ( UCHAR * ) & ucASCIIBuf[MB_SER_PDU_PDU_OFF];

}

else

{

eStatus = MB_EIO;

}

EXIT_CRITICAL_SECTION( );

return eStatus;

}

当看到UCHAR ** pucFrame的时候就优点晕了。不就是传出一个地址吗?干吗还要用指向指针的指针?于是,顺手修改了程序,将那个形参变成了UCHAR * pucFrame,具体的函数也变成了下面的样子:

eMBErrorCode

eMBASCIIReceive( UCHAR * pucRcvAddress, UCHAR * pucFrame, USHORT * pusLength ) {

eMBErrorCode eStatus = MB_ENOERR;

ENTER_CRITICAL_SECTION( );

assert( usRcvBufferPos < MB_SER_PDU_SIZE_MAX );

/* Length and CRC check */

if( ( usRcvBufferPos >= MB_SER_PDU_SIZE_MIN )

&& ( prvucMBLRC( ( UCHAR * ) ucASCIIBuf, usRcvBufferPos ) == 0 ) )

{

/* Save the address field. All frames are passed to the upper layed

* and the decision if a frame is used is done there.

*/

*pucRcvAddress = ucASCIIBuf[MB_SER_PDU_ADDR_OFF];

/* Total length of Modbus-PDU is Modbus-Serial-Line-PDU minus

* size of address field and CRC checksum.

*/

*pusLength = ( USHORT )( usRcvBufferPos - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_LRC );

/* Return the start of the Modbus PDU to the caller. */

pucFrame = ( UCHAR * ) & ucASCIIBuf[MB_SER_PDU_PDU_OFF];

}

else

{

eStatus = MB_EIO;

}

EXIT_CRITICAL_SECTION( );

return eStatus;

}

编译后运行,却得不到自己想要的结果。只得回来再分析这个函数。首先搜索到CSDN 上的一篇文章;https://www.doczj.com/doc/ff8847234.html,/author/kgdiwss/477390ddb16b44faa06b6c7014908469.html,里面又好好地对指针做了分析。我下面就把自己的理解再写一遍,以加深印象。

1,指针在编译的时候会变成什么?

如果我们如下声明变量:

char a;

short int i;

short int *pi;

那么编译的时候,编译器会在内存空间的某处为上面的变量开辟存储空间,下面是一个可能的示意图:

内存地址1 2 3 4 5 6 7 8 9 10

------------------------------

|char a |short int i |short int *pi |

如上所示,int a 占用一个字节,short int i 占用2个字节,short int *pi 占用2个字节。当我们做了如下的赋值的时候:

i = 88;

pi = &a;

内存映象会得到改变:

|int a | 88 | 2 |

从上面可以看到,pi是个指针,他的值是2,是变量i 的内存的起始地址。当我们对*pi 进行操作的时候,其实就是对变量i 进行操作。如*pi = 66; ,则等价i = 66;。下面我们再分析指向指针的指针。指针变量本身跟其他变量一样也是在某个内存地址中存储的,我们也可以让一个指针指向这个地址(指针)。看如下代码:

short int **ppi;

ppi = π

首先声明了一个指向指针的指针变量ppi,这个ppi是用来存储一个short int *类型指针变量的地址的。第二句的意思是pi的地址赋值给ppi,就是将地址值4给ppi,如下图表示:|int a | short int i |short int *pi|short int **ppi |

|int a | 88 | 2 | 4 |

这样,ppi的值为4,就是pi在内存中的起始地址

*ppi的值为2,是pi的值

**ppi的值是88,是i的值,也是*pi的值

有了上面的分析,我们在看上面那个错误的函数:

eMBErrorCode

eMBASCIIReceive( UCHAR * pucRcvAddress, UCHAR * pucFrame, USHORT * pusLength ) {

eMBErrorCode eStatus = MB_ENOERR;

ENTER_CRITICAL_SECTION( );

assert( usRcvBufferPos < MB_SER_PDU_SIZE_MAX );

/* Length and CRC check */

if( ( usRcvBufferPos >= MB_SER_PDU_SIZE_MIN )

&& ( prvucMBLRC( ( UCHAR * ) ucASCIIBuf, usRcvBufferPos ) == 0 ) )

{

/* Save the address field. All frames are passed to the upper layed

* and the decision if a frame is used is done there.

*/

*pucRcvAddress = ucASCIIBuf[MB_SER_PDU_ADDR_OFF];

/* Total length of Modbus-PDU is Modbus-Serial-Line-PDU minus

* size of address field and CRC checksum.

*/

*pusLength = ( USHORT )( usRcvBufferPos - MB_SER_PDU_PDU_OFF - MB_SER_PDU_SIZE_LRC );

/* Return the start of the Modbus PDU to the caller. */

pucFrame = ( UCHAR * ) & ucASCIIBuf[MB_SER_PDU_PDU_OFF];

}

else

{

eStatus = MB_EIO;

}

EXIT_CRITICAL_SECTION( );

return eStatus;

}

重点关注这个语句:pucFrame = ( UCHAR * ) & ucASCIIBuf[MB_SER_PDU_PDU_OFF];,这句话的意思是将形式参数的值进行改变。

当调用具体函数的时候eMBASCIIReceive( rcvaddress, pFrame, plen )的时候,首先将实参的值等于形参的值,然后函数体内又对形参值进行了改变,而实参pFrame并没有得到改变。如果将形参变量变成了UCHAR ** pucFrame,我们再来分析:

当函数调用的时候,变成了eMBASCIIReceive( rcvaddress, pFrame, &plen );那么

pucFrame = &pFrame;

在函数体内,pucFrame 指向pFrame。对*pucFrame 进行修改,就是对pFrame的值进行修改。

所有,这儿要传递地址必须采用指向指针的指针才形。

[摘要]

指针是C和C++语言编程中最重要的概念之一,也是最容易产生困惑并导致程序出错的问题之一。利用指针编程可以表示各种数据结构, 通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯;并能像汇编语言一样处理内存地址,从而编出精练而高效的程序。指针极大地丰富了C和C++语言的功能。

在本文中,主要分两部分对指针进行讨论。首先,基础篇讨论关于指针的内容和运算操作等,可以是读者对指针的知识有一定了解和认识;随后在使用篇中重点讨论指针的各种应用,揭破指针在日常编程中的精髓,从而使读者能够真正地了解、认识和使用指针。

[关键字] C C++ 指针引用数组结构体类

第一篇:基础篇

1.1指针的概念

谈到指针,它的灵活性和难控制性让许多程序员谈虎色变;但它的直接操作内存,在数据操作方面有着速度快,节约内存等优点,又使许多C++程序员的深爱不以.那么指针究竟是怎么样一个概念呢?

其实, 指针就是一类变量,是一类包含了其他变量或函数的地址的变量。与其他变量所不同的是,一般的变量包含的是实际的真实的数据,而指针是一个指示器,它告诉程序在内存的哪块区域可以找到数据。

好了,在这里我们可以这样定义指针:指针是一类包含了其他变量或函数的地址的变量,它里面存储的数值被解释成为内存的地址.

1.2指针的内容

简单讲,指针有四个方面的内容:即指针的类型,指针所指向的类型,指针的值,指针本身所占有的内存区.下面我们将分别阐述这些内容.

1.2.1指针的类型

从语法的角度看,指针的类型是指把指针声明语句中的指针名字去掉所剩下的部分。这是指针本身所具有的类型。例如:

int*ip; //指针的类型是int*

char*ip; //指针的类型是char*

int**ip; //指针的类型是int**

int(*ip)[5]; //指针的类型是int(*)[5]

1.2.2指针所指向的类型

当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么类型来看待。从语法的角度看,指针所指向的类型是指针声明语句中的指针名字和名字左边的指针声明符*去掉所剩下的部分。例如:

int*ip; //指针所指向的类型是int

char*ip; //指针所指向的类型是char

int**ip; //指针所指向的类型是int*

int(*ip)[5]; //指针所指向的类型是int()[5]

1.2.3指针的值(或称指针所指向的内存区)

指针的值或者叫指针所指向的内存区或地址,是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。

指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在上例中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。

以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里?

1.2.4指针本身所占有的内存区

指针本身所占有的内存区是指针本身占内存的大小,这个你只要用函数sizeof(指针的类型)测一下就知道了。在32位平台里,指针本身占据了4个字节的长度。

指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。

1.3指针与内存管理

利用指针你可以将数据写入内存中的任意位置,但是,一旦你的程序中有一个野指针("wild”pointer),即指向一个错误位置的指针,你的数据就危险了—存放在堆中的数据可能会被破坏,用来管理堆的数据结构也可能会被破坏,甚至操作系统的数据也可能会被修改,有时,上述三种破坏情况会同时发生。所以合理的正确的分配指针的地址是非常重要的。

1.3.1内存分配的方式

内存分配方式有三种:

(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

(2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

(3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多,以下我们重点讲解动态内存分配。

1.3.2 malloc/free 的使用要点

malloc与free是C/C++语言的标准库函数,它用于申请动态内存和释放内存。

函数malloc的原型如下:

void * malloc(size_t size);

用malloc申请一块长度为length的整数类型的内存,程序如下:

int *ip = (int *) malloc(sizeof(int) * length);

我们应当把注意力集中在两个要素上:“类型转换”和“sizeof”。

malloc函数返回值的类型是void *,所以在调用malloc时要显式地进行类型转换,将void * 转换成所需要的指针类型。

malloc函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。例如int变量在16位系统下是2个字节,在32位下是4个字节;而float变量在16位系统下是4个字节,在32位下也是4个字节。这个你可以用sizeof(类型)去测试。

在malloc的“()”中使用sizeof运算符是良好的风格,但要当心有时我们会昏了头,写出ip = malloc(sizeof(ip))这样的程序来。

函数free的原型如下:

void free( void * memblock );

为什么free函数不象malloc函数那样复杂呢?这是因为指针p的类型以及它所指的内存的容量事先都是知道的,语句free(p)能正确地释放内存。如果p是NULL指针,那么free对p 无论操作多少次都不会出问题。如果p不是NULL指针,那么free对p连续操作两次就会导致程序运行错误。

1.3.3 new/delete 的使用要点

对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。

因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数,只是C++的运算符。我们来看如下例子就知道怎么回事了。

class Object

{

public :

Object(void){std::cout << “Initialization”<< std::endl; }

~Object(void){std::cout << “Destroy”<< std::endl; }

void Initialize(void){std:: cout << “Initialization”<< std::endl; }

void Destroy(void){ std::cout << “Destroy”<< std::endl; }

}

void UseMallocFree(void)

{

Object *ip = (Object *)malloc(sizeof(Object)); // 申请动态内存

ip->Initialize(); // 初始化

//…

ip->Destroy(); // 清除工作

free(ip); // 释放内存

}

void UseNewDelete(void)

{

Object *ip = new Object; // 申请动态内存并且初始化

//…

Delete ip; // 清除并且释放内存

}

用malloc/free和new/delete如何实现对象的动态内存管理类Object的函数Initialize模拟了构造函数的功能,函数Destroy模拟了析构函数的功能。函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成初始化与清除工作。函数UseNewDelete则简单得多。

所以我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。new内置了sizeof、类型转换和类型安全检查功能, ,对于非内部数据类型的对象而言,new 在创建动态对象的同时完成了初始化工作。

new/delete 常使用的方法如下:

typeof *ip = new typeof[length];

类/结构*ip = new 类结构;

一般释放如下:delete ip;

数组的释放如下:delete [] ip;

1.3.4内存耗尽怎么办?

如果在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告内存申请失败。通常有三种方式处理“内存耗尽”问题。

(1)判断指针是否为NULL,如果是则马上用return语句终止本函数。例如:

void Func(void)

{

A *a = new A;

if(a == NULL)

{

return;

}

}

(2)判断指针是否为NULL,如果是则马上用exit(1)终止整个程序的运行。例如:

void Func(void)

{

A *a = new A;

if(a == NULL)

{

std::cout << “Memory Exhausted”<< std::endl;

exit(1);

}

}

(3)为new和malloc设置异常处理函数。例如Visual C++可以用_set_new_hander函数为new设置用户自己定义的异常处理函数,也可以让malloc享用与new相同的异常处理函数。详细内容请参考C++使用手册。

有一个很重要的现象要告诉大家。对于32位以上的应用程序而言,无论怎样使用malloc 与new,几乎不可能导致“内存耗尽”。因为32位操作系统支持“虚存”,内存用完了,自动用硬盘空间顶替。我不想误导读者,必须强调:不加错误处理将导致程序的质量很差,千万不可因小失大。

1.3. 5杜绝“野指针”

“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。“野指针”的原因主要有如下几种:

(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如

char *ip = NULL;

char *ip = new char;

(2)指针ip被free或者delete之后,没有置为NULL,让人误以为ip是个合法的指针。(3)指针操作超越了变量的作用范围。这种情况让人防不胜防,示例程序如下:

class A

{

public:

void Func(void){ std::cout << “Func of class A”<< std::endl; }

};

void Test(void)

{

A *p;

{

A a;

p = &a; // 注意 a 的生命期

}

p->Func(); // p是“野指针”

}

函数Test在执行语句p->Func()时,对象a已经消失,而p是指向a的,所以p就成了“野指针”。但奇怪的是有些编译器运行这个程序时居然没有出错,这可能与编译器有关。

1.3.6指针参数是如何传递内存的?

如果函数的参数是一个指针,不要指望用该指针去申请动态内存。见如下例子:

void GetMemory(char *ip, int num)

{

ip = (char *)malloc(sizeof(char) * num);

}

void Test(void)

{

char *str = NULL;

GetMemory(str, 100); // str 仍然为NULL

strcpy(str, "hello"); // 运行错误

}

试图用指针参数申请动态内存

毛病出在函数GetMemory中。编译器总是要为函数的每个参数制作临时副本,指针参数ip的副本是_ip,编译器使_ip = ip。如果函数体内的程序修改了_ip的内容,就导致参数ip 的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_ip申请了新的内存,只是把_ip所指的内存地址改变了,但是ip丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。

如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”,见如下示例:void GetMemory(char **p, int num)

{

*ip = (char *)malloc(sizeof(char) * num);

}

void Test(void)

{

char *str = NULL;

GetMemory(&str, 100); // 注意参数是&str,而不是str

strcpy(str, "hello");

std::cout<< str << std::endl;

free(str);

}

用指向指针的指针申请动态内存

当然,我们也可以用函数返回值来传递动态内存。这种方法更加简单,见如下示例:char *GetMemory(int num)

{

char *ip = (char *)malloc(sizeof(char) * num);

return ip;

}

void Test(void)

{

char *str = NULL;

str = GetMemory(100);

strcpy(str, "hello");

std::cout<< str << std::endl;

free(str);

}

用函数返回值来传递动态内存

用函数返回值来传递动态内存这种方法虽然好用,但是常常有人把return语句用错了。这里强调不要用return语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡,见如下示例:

char *GetString(void)

{

char p[] = "hello world";

return p; // 编译器将提出警告

}

void Test(void)

{

char *str = NULL;

str = GetString(); // str 的内容是垃圾

std::cout<< str << std::endl;

}

return语句返回指向“栈内存”的指针

最后,根据以上阐述,我们总结如下使用规则供大家参考:

【规则1】用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。

【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。【规则3】避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。

【规则4】动态内存的申请与释放必须配对,防止内存泄漏。

【规则5】用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。

1.4指针的运算

1.4.1赋值运算

指针变量的赋值运算有以下几种形式:

1.4.1.1指针变量初始化赋值如下:

int a;

int *ip=&a;

1.4.1.2把一个变量的地址赋予指向相同数据类型的指针变量。例如:

int a;

int *ip;

ip=&a; //把整型变量a的地址赋予整型指针变量ip

1.4.1.3把一个指针变量的值赋予指向相同类型变量的另一个指针变量。例如:

int a;

int *pa=&a;

int *pb;

pb=pa; //把a的地址赋予指针变量pb

由于pa,pb均为指向整型变量的指针变量,因此可以相互赋值。

1.4.1.4把数组的首地址赋予指向数组的指针变量。例如:

int a[5],*pa;

pa=a; //数组名表示数组的首地址,故可赋予指向数组的指针变量pa

也可写为:

pa=&a[0]; //数组第一个元素的地址也是整个数组的首地址也可赋予pa

当然也可采取初始化赋值的方法:

int a[5],*pa=a;

以上是一些基本的数组赋值方法,后面我们会详细讨论指针在数组中的使用。

1.4.1.5把字符串的首地址赋予指向字符类型的指针变量。例如:

char *pc;

pc="c language";

或用初始化赋值的方法写为:

char *pc=" c language ";

这里应说明的是并不是把整个字符串装入指针变量,而是把存放该字符串的字符数组的首地址装入指针变量。

1.4.1.6把函数的入口地址赋予指向函数的指针变量。例如:

int (*pf)();

pf=f; //f为函数名

1.4.2加减运算

对于指向数组的指针变量,可以加上或减去一个整数n。设ip是指向数组a 的指针变量,则ip+n,ip-n,ip++,++ip,ip--,--ip 运算都是合法的。指针变量加或减一个整数n的意义是把指针指向的当前位置(指向某数组元素)向前或向后移动n个位置。应该注意,数组指针变量向前或向后移动一个位置和地址加1或减1 在概念上是不同的。因为数组可以有不同的类型,各种类型的数组元素所占的字节长度是不同的。如指针变量加1,即向后移动1 个位置表示指针变量指向下一个数据元素的首地址。而不是在原地址基础上加1。看如下例子:

char a[20];

int*ip=a;

...

ip++;

在上例中,指针ip的类型是int*,它指向的类型是int,它被初始化为指向整形变量a。接下来的第3句中,指针ip被加了1,编译器是这样处理的:它把指针ip的值加上了sizeof(int),在32位程序中,是被加上了4。由于地址是用字节做单位的,故ip所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。

由于char类型的长度是一个字节,所以,原来ptr是指向数组a的第0号单元开始的四个字节,此时指向了数组a中从第4号单元开始的四个字节。再看如下例子:

char a[20];

int*ip=a;

...

ip+=5;

在这个例子中,ip被加上了5,编译器是这样处理的:将指针ip的值加上5乘sizeof(int),在32位程序中就是加上了5乘4=20。由于地址的单位是字节,故现在的ip所指向的地址比起加5后的ip所指向的地址来说,向高地址方向移动了20个字节。在这个例子中,没加5前的ip指向数组a的第0号单元开始的四个字节,加5后,ptr已经指向了数组a的合法范围之外了。虽然这种情况在应用上会出问题,但在语法上却是可以的。这也体现出了指针的灵活性。

如果上例中,ip是被减去5,那么处理过程大同小异,只不过ip的值是被减去5乘sizeof(int),新的ip指向的地址将比原来的ip所指向的地址向低地址方向移动了20个字节。

总结一下,一个指针ipold加上一个整数n后,结果是一个新的指针ipnew,ipnew的类型和ipold的类型相同,ipnew所指向的类型和ipold所指向的类型也相同。ipnew的值将比ipold的值增加了n乘sizeof(ipold所指向的类型)个字节。就是说,ipnew所指向的内存区将比ipold所指向的内存区向高地址方向移动了n乘sizeof(ipold所指向的类型)个字节。

一个指针ipold减去一个整数n后,结果是一个新的指针ipnew,ipnew

的类型和ipold的类型相同,ipnew所指向的类型和ipold所指向的类型也相同。ipnew的值将比ipold的值减少了n乘sizeof(ipold所指向的类型)个字节,就是说,ipnew所指向的内存区将比ipold所指向的内存区向低地址方向移动了n 乘sizeof(ipold所指向的类型)个字节。

1.4.3关系运算

指向同一个数组中的不同元素的两个指针可以进行各种关系运算。例如:

ip1==ip2表示ip1和ip2指向同一数组元素

ip1>ip2表示ip1处于高地址位置

ip1

指针变量还可以与0比较。设ip为指针变量,则ip==0表明ip是空指针,它不指向任何变量;ip!=0表示ip不是空指针。空指针是由对指针变量赋予0值而得到的。例如:

#define NULL 0

int *ip=NULL;

对指针变量赋0值和不赋值是不同的。指针变量未赋值时,可以是任意值,是不能使用的。否则将造成意外错误。而指针变量赋0值后,则可以使用,只是它不指向具体的变量而已。

1.4.4取地址运算符‘&’和取内容运算符‘*’

取地址运算符&是单目运算符,其结合性为自右至左,其功能是取变量的地址。

取内容运算符*是单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。在*运算符之后跟的变量必须是指针变量。需要注意的是指针运算符*和指针变量说明中的指针说明符* 不是一回事。在指针变量说明中,‘*’是类型说明符,表示其后的变量是指针类型。而表达式中出现的‘*’则是一个运算符用以表示指针变量所指的变量。如下例子:

int a=12;

int b;

int *p;

int **ptr;

p=&a; //&a的结果是一个指针,类型是int*,指向的类型是int,指向的地址是a的

//地址。

*p=24; //*p的结果,在这里它的类型是int,它所占用的地址是p所指向的地址。

ptr=&p; //&p的结果是个指针,该指针的类型是p的类型加个*,在这里是int **。该

//指针所指向的类型是p的类型,这里是int*。该指针所指向的地

址就是指针

//p自己的地址。

*ptr=&b;//*ptr是个指针,&b的结果也是个指针,且这两个指针的类型和所指向的类型//是一样的,所以用&b来给*ptr赋值就是毫无问

题的了。

**ptr=34;//*ptr的结果是ptr所指向的东西,在这里是一个指针,对这个指针再做一次*

//运算,结果就是一个int类型的变量。

1.4.5关于括号组合

在解释组合说明符时,标识符右边的方括号和圆括号优先于标识符左边的“*”号,而方括号和圆括号以相同的优先级从左到右结合。但可以用圆括号改变约定的结合顺序。

阅读组合说明符的规则是“从里向外”。从标识符开始,先看它右边有无方括号或园括号,如有则先作出解释,再看左边有无*号。如果在任何时候遇到了闭括号,则在继续之前必须用相同的规则处理括号内的内容。

1.5指针表达式

一个表达式的最后结果如果是一个指针,那么这个表达式就叫指针表式。所以指针表达式也具有指针所具有的四个要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占据的内存。(预知后事如何,且听下回分解!!!)

彻底搞定C指针-指向另一指针的指针

一.回顾指针概念:

早在本系列第二篇中我就对指针的实质进行了阐述。今天我们又要学习一个叫做指向另一指针地址的指针。让我们先回顾一下指针的概念吧!

当我们程序如下申明变量:

short int i;

char a;

short int * pi;

程序会在内存某地址空间上为各变量开辟空间,如下图所示。

内存地址→6 7 8 9 10 11 12 13 14 15 -------------------------------------------------------------------------------------

… | | | | | | | | | |

-------------------------------------------------------------------------------------

|short int i |char a| |short int * pi|

图中所示中可看出:

i 变量在内存地址5的位置,占两个字节。

a变量在内存地址7的位置,占一个字节。

pi变量在内存地址9的位置,占两个字节。(注:pi 是指针,我这里指针的宽度只有两个字节,32位系统是四个字节)

接下来如下赋值:

i=50;

pi=&i;

经过上在两句的赋值,变量的内存映象如下:

内存地址

→6 7 8 9 10 11 12 13 14 15

--------------------------------------------------------------------------------------

… | 50 | | | 6 | | | |

--------------------------------------------------------------------------------------

|short int i |char a| |short int * pi|

看到没有:短整型指针变量pi的值为6,它就是I变量的内存起始地址。所以,这时当我们对*pi进行读写操作时,其实就是对i变量的读写操作。如:

*pi=5; //就是等价于I=5;

你可以回看本系列的第二篇,那里有更加详细的解说。

二.指针的地址与指向另一指针地址的指针

在上一节中,我们看到,指针变量本身与其它变量一样也是在某个内存地址中的,如pi的内存起始地址是10。同样的,我们也可能让某个指针指向这个地址。

看下面代码:

short int * * ppi; //这是一个指向指针的指针,注意有两个*号

ppi=π

第一句:short int * * ppi;——申明了一个指针变量ppi,这个ppi是用来存储(或称指向)一个short int * 类型指针变量的地址。

第二句:&pi那就是取pi的地址,ppi=π就是把pi的地址赋给了ppi。即将地址值10赋值给ppi。如下图:

内存地址

→6 7 8 9 10 11 12 13 14 15

------------------------------------------------------------------------------------

… | 50 | | | 6 | 10 | |

------------------------------------------------------------------------------------

|short int i|char a| |short int * pi|short int ** ppi|

从图中看出,指针变量ppi的内容就是指针变量pi的起始地址。于是……

ppi的值是多少呢?——10。

*ppi的值是多少呢?——6,即pi的值。

**ppi的值是多少呢?——50,即I的值,也是*pi的值。

呵呵!不用我说太多了,我相信你应明白这种指针了吧!

三.一个应用实例

1.设计一个函数:void find1(char array[], char search, char * pi)

要求:这个函数参数中的数组array是以0值为结束的字符串,要求在字符串array中查找字符是参数search里的字符。如果找到,函数通过第三个参数(pa)返回值为array字符串中第一个找到的字符的地址。如果没找到,则为pa为0。设计:依题意,实现代码如下。

void find1(char [] array, char search, char * pa)

{

int i;

for (i=0;*(array+i)!=0;i++)

{

if (*(array+i)==search)

{

pa=array+i

break;

}

else if (*(array+i)==0)

{

pa=0;

break;

}

}

}

你觉得这个函数能实现所要求的功能吗?

调试:

我下面调用这个函数试试。

void main()

char str[]={“afsdfsdfdf\0”}; //待查找的字符串

char a=’d’; //设置要查找的字符

char * p=0; //如果查找到后指针p将指向字符串中查找到的第一个字符的地址。

find1(str,a,p); //调用函数以实现所要操作。

if (0==p )

{

printf (“没找到!\n”);//1.如果没找到则输出此句

}

else

{

printf(“找到了,p=%d”,p); //如果找到则输出此句

}

}

分析:

上面代码,你认为会是输出什么呢?

运行试试。

唉!怎么输出的是:没有找到!

而不是:找到了,……。

明明a值为’d’,而str字符串的第四个字符是’d’,应该找得到呀!

再看函数定义处:void find1(char [] array, char search, char * pa)

看调用处:find1(str,a,p);

依我在第五篇的分析方法,函数调用时会对每一个参数进行一个隐含的赋值操作。

整个调用如下:

array=str;

search=a;

pa=p; //请注意:以上三句是调用时隐含的动作。

int i;

for (i=0;*(array+i)!=0;i++)

{

if (*(array+i)==search)

{

pa=array+i

break;

}

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

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.

C语言和操作系统学习笔记

深入理解计算机系统 存储器层次 CPU主频: 3.2 GHz 高速缓存(1~10ns, 一个周期) 主存(10~100ns) 辅助(磁盘) (1byte/10ms, 一次可以传送大量字节, 几十到几百个周期) 三级存储(分钟为单位) 虚拟存储 虚拟页(VP), 物理页(PA), 页表(Page Table), 页表条目(PTE, Page Table Entry), DRAM(虚拟存储器缓存), SRAM(CPU和主存的缓存), MMU(存储器管理单元), 路旁转换缓冲(TLB, Translation Lookaside Buffer) 东芝satalite L700笔记本进入BIOS(ctrl + alt + del 之后F12) Ubuntu 15.10可能不适配NVDIA显卡(如: NVDIA GeFore GTX 745) Day01 C语言程序的绝大部分必须记录在以.c作为扩展名的文件里,这种文件叫源文件 C语言程序里可以直接使用加减乘除四则运算 符号(+、-、*、/) 每个独立的计算步骤最后必须使用分毫结束,用分号结束的一个计算步骤叫一条语句 任何C语言程序一个由大量的语句构成 C语言程序中,采用分组的方式管理所有的语句 一组里的所有语句必须写在一对大括号里 可以吧一组里面的语句再次进行分组 绝大多数语句必须属于某个分组 任何语句不可以跨越分组 不被其他大括号包含的大括号可以叫做顶级大括号 顶级大括号可以用来表示函数(可以吧函数看成一组语句) 每个函数必须有自己的名字,不用的函数的名字必须不同 任何C语言程序一对由一个活多个函数构成 C语言程序中必须有一个叫做main的函数,这个函数叫做主函数 C语言程序必须从主函数的第一条语句开始执行 当主函数的最后一条语句结束的时候整个程序结束 C语言程序允许一个函数的结束的时候遗留一个数字,这个数字叫做这个函数是返回值

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

《普通语言学教程》索绪尔 绪论 第一章语言学史一瞥 语法(规范)-语文学(过于注重书面语)-比较语文学或比较语法(只比较)-新语法学派(语言集团集体精神的产物) 第二章语言学的材料和任务;与毗邻科学的关系 语言学的任务是: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世纪以前的语文学最根本的区别在于:把语言看成是由各个符号之间的关系组成的有价值的结构系统。 《普通语言学课程》是一部什么样的书? 《普通语言学教程》是由索绪尔的两位弟子兼同事根据学生们的听课笔记整理而成的。《普通语言学教程》是现代语言学的奠基之作。索绪尔区分了语言和言语,语言属于全社会,是抽象的;言语属于个人,是具体的。索绪尔认为语言是符号系统,“是一个纯粹的价值系统”。每个符号是由“能指”和“所指”构成的,所指和能指之间的关系是任意的。符号之间存在着线性的句段关系和联想的聚合关系。索绪尔把语言现象分为“共时”和“历时”两种,“共时”是指时间历程中的某一点上的语言状态,“历时”是指以时间历程中的某一点到以后的语言现象。索绪尔认为,语言学的对象是语言,由于语言有它的内部要素,也有它的外部要素,所以语言学也可以分为内部语言学和外部语言学。总之,《普通语言学教程》的语言学

C语言程序设计读书笔记题目

读书笔记注意事项: 1、 读书笔记要求至少有六个题目,在一类、二类、三类题目中各选两题,具体题目选择由 学生自行选择。 2、 每个题目必须包含所选题目,以及具体题目的程序实现过程,要求每行语句后都需要有 程序解释,如:int a,b,c; /*定义三个变量a,b,c ,变量类型为整型*/。 3、 读书笔记要求全部手写,在17周由学习委员统一交给任课教师。 一、一类题目 1. 输入任意3个整数,求它们的平均值。 2. 输入任意4个整数,求它们的平均值。 3. 输入一个非负数,计算以这个数为半径的圆周长和面积。 4. 将从键盘输入的实型十进制数分离为整数部分和小数部分后输出。如输入 123.45,输出为:123.45=123+0.45 5. 输入3个字符,反向输出这3个字符和它们的ASCII 码。 6. 输入4个字符,反向输出这4个字符和它们的ASCII 码。 7. 输入任意一个3位数,将其各位数字反序输出(例如输入123,输出321)。 8. 求前n 项的累加和。如S=1+2+3+…+n 。 9. 求n !。如fac=1*2*3*…*n 。 10.输入三角形的边长,求三角形的面积(面积=sqrt(s(s-a)(s-b)(s-c)), s=(a+b+c)/2)。 11.输入一个华氏温度,要求输出摄氏温度,公式为:)(32f 95 c -=,输出前要有提示信息,输出结果保留小数点后两位。 12.求前驱字符和后继字符。输入一个字符,找出它的前驱字符和后继字符,并 按ASCII 码值,按从大到小的顺序输出这3个字符及其对应的ASCII 码值。 13.输入一个非负数,计算以这个数为半径的圆周长和面积。 14.输入两个字符,若这两个字符的序号(ASCII 码)之差为偶数,则输出它们 的后继字符,否则输出它们的前驱字符。 15.输入整数a 和b ,如果a 能被b 整除,就输出算式和商,否则输出算式、整 数商和余数。 二、二类题目 1. 输入一个3位数,判断是否是一个“水仙花数”。水仙花数是指3位数的各位 数字的立方和等于这个3位数本身。例如:153=1*1*1+5*5*5+3*3*3。 2. 试编写一程序,将所有3位数中是“水仙花数”的输出。

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

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

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

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

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

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

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

C语言中math.h中包含的函数原型和使用方法 C语言学习笔记

C语言中#include中包含的函数原型和使用方法 作者:爱学习的狼先生 前言:include是文件包含命令,和英文名一样,意思是:将< >中的文件引用到 程序员所写的程序中,< >中的文件通常是由系统提供,其扩展名为“.h”,也就是我 们常说的头文件, 当然有时候我们在实际的项目开发中也可以根据自己需求自己定义,不过要是C语言的库文件函数中要是有的话最好自己直接引用,因为这样可以简化代码,便于维护和调试,缩短程序开发的周期,特别是对于初学C语言的同学们,尽量 直接调用库文件函数,因为这一定是对的。 在我们学习C语言的过程中常常看到#include, #include, #include等等,我记得我在初学C语言时老师只告诉我这些头文件定义了很 多函数原型,想用的时候随便引用就可以了,但却没有过多的解释,今天,我就详细 的和大家探讨一下中的函数原型和使用方法(注以下这些是本人根据多年编程经验所写,如有解释不当之处,还请大家批评改正) 求取绝对值的函数 int abs(int i); //返回整型数i的绝对值;例如 int abs(-3.5) == 3.5; //double cabs(struct complex znum); //返回复数znum绝对值; double fabs(double x); //返回双精度数x的绝对值;例如 double fabs(-103.5) == 103.5; long labs(long n); //返回长整型n的绝对值;例如long labs(-1111122222) == 1111122222; 求取对数和指数函数 double log(long double x); //返回以e为底的对数;例如double log(2) == 0.693147 double log10(double x); //返回以10为底的对数;例如double log10(100) == 2; double exp(double x); //返回以e为底的幂;例如 double exp(3) == 20.085537; double pow(double x, double y); //返回以x的y次幂,例如pow(3,2) == 9; float powf(double x, double y); //返回x的y次幂,值为浮点数,例powf(3,2.5) == 15.588457; double sqrt(double x); //返回x的开方值,例如 double sqrt(4) == 2; 数值处理函数 double floor(double x); //返回不大于x的最大整数;例如 floor(4.2)==4, floor(-3.5)==-4; double ceil(double x); //返回不小于x的最小整数,例如 ceil(4.2)==5, floor(-3.5)==-3; double fmod(double x, double y); //返回x/y的余数,相当于x%y, 例如 fmod(5,3)==2;

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

语言学纲要讲义笔记 导言 一、语言的定义 语言是人类最重要的交际工具和思维工具、是由音义结合的词汇和语法构成的一种符号系统。 二、语言学的对象和任务 语言学是研究语言的科学。 要把语言学跟语文学区分开来 中国传统语文学——“小学” 小学是我国古代语文学的统称,由训诂学、文字学、音韵学三部分组成。 在古印度,公元前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.异化:语流中两个相同或相近的音,其中一个因受另一个影响而变得不相同或不相近。

c语言笔记

慕课网C语言第四章笔记 1 多重循环语句的使用: For循环中的变量步进值 2 思维模式的注意一些事项 函数 C语言提供了大量的库函数(右侧资料下载中有),比如stdio.h提供输出函数,但是还是满足不了我们开发中的一些逻辑,所以这个时候需要自己定义函数,自定义函数的一般形式:

注意: 1、[]包含的内容可以省略,数据类型说明省略,默认是int类型函数;参数省略表示该函数是无参函数,参数不省略表示该函数是有参函数; 2、函数名称遵循标识符命名规范; 3、自定义函数尽量放在main函数之前,如果要放在main函数后面的话,需要在main函数之前先声明自定义函数,声明格式为:[数据类型说明] 函数名称([参数]); 那么函数的返回值是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。 函数的返回值要注意以下几点: 1. 函数的值只能通过return语句返回主调函数。return语句的一般形式为: return 表达式或者为:return (表达式); 2. 函数值的类型和函数定义中函数的类型应保持一致。如果两者不一致,则以函数返回类型为准,自动进行类型转换。 3. 没有返回值的函数,返回类型为void。如果小刚算了一会没有返回结果的话,那么用代码表示就是: 注意:void函数中可以有执行代码块,但是不能有返回值,另void函数中如果有return语句,该语句只能起到结束函数运行的功能。其格式为:return; 错误!

错误! 函数的调用的一些问题 #include /* Jone算出结果应该怎么写函数? */ int joneResult(int x, int y, int z) { int sum = x+y+z; return sum/3; //这里是不是应该将sum返回呢? } /* Jack没有算出结果只说了一句话是不是应该用无返回值函数? */ void jackResult(int x, int y, int z) { printf("我算不出来\n"); return 0; } int main() { int a, b, c; a = 10; b = 20; c = 30; //Jone的返回值类型是什么? int jR = joneResult(a, b, c);

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

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

语言学概论_自考笔记+自考资料

科目:语言学概论 1.1.能指 1.2.所指 1.3.普通语言学 1.4.应用语言学 1.5.传统语言学 2.1.语音 2.2.音质 2.3.基音和陪音 2.4.语音的生理基础 2.5.口音、鼻音、鼻化音 2.6.主动的发音器官和被动的发音器 官 2.7.宽式标音和严式标音 2.8.标准元音 2.9.口元音和鼻化元音 2.10.音位的条件变体和音位的自由 变体 2.11.音渡 2.12.音节结构的元辅音分析法 2.13.韵头和韵尾 2.14.语流音变 2.15.时位 2.16.调值和调类 2.17.连续变调 2.18.调位 2.19.固定重音和自由重音 2.20.主重音和次重音 2.21.重位 2.22.语调 2.23.发音部位 2.24.音素 2.25.韵律特征 3.1.语汇学 3.2.古语词 3.3.方言词 3.4.外来词 3.5.科技术语和行业语 3.6.歇后语 3.7.变形成词中的逆序成词3.8.变形成词中的简缩成词 3.9.复合构词 3.10.附加构词 3.11.离合词和词组词 4.1.语法 4.2.历时语法和共时语法 4.3.普遍语法和个别语法 4.4.核心语法和外围语法 4.5.虚词 4.6.辅助词和功能词 4.7.向心词组 5.1.语义 5.2.词汇意义和语法意义 5.3.语义的民族性 5.4.词义 5.5.词的感情色彩 5.6.义素 5.7.单义词和多义词 5.8.述谓结构 5.9.语义角色 5.10.语义指向 5.11.蕴含 6.1.他源文字 6.2.单纯字符和复合字符 6.3.词语文字和语素文字 6.4.音位文字 6.5.表意文字和表音文字 6.6.假借字 6.7.楔形文字 6.8.象形字和会意字 6.9.独体字和合体字 6.10.音节文字 7.1.语音对应关系 7.2.语言的亲属关系 7.3.原始基础语和子语 7.4.标准语 7.5.双言现象 7.6.克里奥耳语 7.7.语言政策 7.8.语言规范化 7.9.语言规划 7.10.基础方言 7.11.语系 8.1.语言思维和非语言思维、形象思 维 8.2.语言能力问题 8.3.失语症 8.4.语言遗传机制 8.5.文化局限词语 9.1.第一语言教学 9.2.外语教学的翻译法 9.3.外语教学的听说法 9.4.母语语言教学和语文教学 9.5.词典 9.6.语言词典 9.7.应用语言学 9.8.第二语言教学 9.9.语言迁移 9.10.语言获得 9.11.中介语 名词解释题答案 1.1.能指是语言符号的物质实体,能 够指称某种意义的成分。 1.2.所指是语言符号所指称的意义内 容,是语言符号的物质实体。 1.3.语言学界把研究人类社会的语言 这种社会现象的一般理论称为普通 语言学。 1.4.语言学界把语言学的理论和具体 成果用来为社会实际生活中的某个 领域服务,这是广义的应用语言学; 狭义的应用语言学是指专门研究语 言教学中的理论和方法。 1.5.传统语言学一般泛指20世纪以 前的语言学,特别是指索绪尔开创 的结构主义语言学以前的语言学。 2.1.语音是由人的发音器官发出的, 负载着一定的意义,并作为语言符 号系统载体的声音。 1.1.如何理解言语交际是一个编码和 解码的过程? 1.2.简述书面语产生的重大意义。 1.3.为什么说语言符号是形式和意义 的统一体? 1.4.在汉语和英语中可以发现:①作 为初始符号,“猫”这个意思,汉语 用“猫”(māo)来表示,而英语用 cat来表示;“书”这个意思,汉语 用“书”(shū)来表示,而英语用 book来表示。②汉语的复合符号, “新书”不同于初始符号“书”;英 语的复合符号newbook不同于初始 符号book。请用语言符号性质的理 论对上述现象作出简要说明。 1.5.举例说明语言符号的任意性。 1.6.为什么语言符号既具有强制性又 具有可变性?

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

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

《普通语言学教程》索绪尔 绪论 第一章语言学史一瞥 语法(规范)-语文学(过于注重书面语)-比较语文学或比较语法(只比较)-新语法学派(语言集团集体精神的产物) 第二章语言学的材料和任务;与毗邻科学的关系语言学的任务是:a 对一切能够得到的语言进行描写并整理他们的历史,尽可能重建每个语系的母语;b 寻求在一切语言中永恒地普遍地起作用的力量,整理出能概况一切历史特殊现象的一般规律;c 确定自己的界限和定义。它与社会心理学、生理学、语文学相关。语言学也有实际用途,特别是对于那些利用文献的人,另外对一般修养也很重要。 第三章语言学的对象 定义——在任何时候,语言都是现行制度和过去的产物。我们的研究方法是一开始就站在语言的阵地上,把它当做言语活动的其他一切表现的准则。语言和言语活动不能混为一谈,它只是言语活动的一个确定的部分,而且当然是一个主要部

分,它既是言语机能的社会产物,又是社会集团为了使个人有可能行使这机能所采用的一整套必不可少的规约。语言本身是一个整体,一个分类的原则。它是一种约定俗成的东西,人们同意使用什么符号,这符号的性质是无关轻重的。对人类天赋的不是口头的言语活动,而是构成语言——即一套和不同的观念相当的不同的符号——的机能。人们说话的机能——不管是天赋的或非天赋的——只有借助于集体所创造和提供的工具才能运用,所以,说语言使言语活动成为统一体,绝不是空想。 语言在言语活动事实中的地位——言语循环重建:心理现象-生理过程-物理过程-生理过程-心理现象

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

C语言中math.h中包含的函数原型和使用方法C语言学习笔记

作者:爱学习地狼先生 前言:是文件包含命令,和英文名一样,意思是:将<>中地文件引用到程序员所写地程序中,<>中地文件通常是由系统提供,其扩展名为“”,也就是我们常说地头文件,当然有时候我们在实际地项目开发中也可以根据自己需求自己定义,不过要是语言地库文件函数中要是有地话最好自己直接引用,因为这样可以简化代码,便于维护和调试,缩短程序开发地周期,特别是对于初学语言地同学们,尽量直接调用库文件函数,因为这一定是对地. 在我们学习语言地过程中常常看到<>, <>, <>等等,我记得我在初学语言时老师只告诉我这些头文件定义了很多函数原型,想用地时候随便引用就可以了,但却没有过多地解释,今天,我就详细地和大家探讨一下<>中地函数原型和使用方法(注以下这些是本人根据多年编程经验所写,如有解释不当之处,还请大家批评改正) 求取绝对值地函数 ( ); 返回整型数地绝对值;例如 () ; ( ); 返回复数绝对值; ( ); 返回双精度数地绝对值;例如 () ; ( ); 返回长整型地绝对值;例如 () ; 求取对数和指数函数 ( ); 返回以为底地对数;例如 () ( ); 返回以为底地对数;例如(); ( ); 返回以为底地幂;例如 () ; ( , ); 返回以地次幂,例如() ; ( , ); 返回地次幂,值为浮点数,例() ; ( ); 返回地开方值,例如 () ; 数值处理函数 ( ); 返回不大于地最大整数;例如 (), (); ( ); 返回不小于地最小整数,例如 (), (); ( , ); 返回地余数,相当于, 例如 (); ( , *); 拆开值,保存整数值,返回小数值例如(, ) ; ( , *); 将拆分为小数和以为底地指数,并返回小数部分,取值范围在或者 例如(, ) ; ( , ); 返回值是*^地值,例如(, ) ; ( , ); 返回直角三角形地斜边长,例如 () ; ( , []); 求取多项式地值,其中为地取值,为地最高次数,[]依次为地次项到最高项地系数,例如^ –^ – ,那么 [] {} () ;

相关主题
文本预览
相关文档 最新文档