知識(shí)點(diǎn)
#include <iostream>
int add(int a,int b){
return a+b;
}
int main(int argc, const char * argv[]) {
int a=5;
int b=3;
int (*p)(int a,int b);
p=add;
int result=p(a, b);
printf("%d \n",result);
return 0;
}
輸出結(jié)果:
8
另一種方式
int add1(int *a,int *b)
{
return (*a)+(*b);
}
int main(int argc, const char * argv[]) {
int a=5;
int b=3;
int (*pp)(void *a,void *b);
pp=(int(*)(void *,void*))add1;//這里要進(jìn)行強(qiáng)轉(zhuǎn)
int result1=pp(&a,&b);
printf("%d\n",result1);
return 0;
}
輸出結(jié)果:
8
另一種情況
char add2(char *a,int *b)
{
return (*a)+(*b);
}
int main(int argc, const char * argv[]) {
char a='a';
int b=1;
int (*ppp)(void *a,void *b);
ppp=(int(*)(void *,void*))add2;
char result2=ppp(&a,&b);
printf("%c\n",result2);
return 0;
}
輸出結(jié)果:
b
說(shuō)明int (*ppp)(void *a,void *b);這種定義指針的方法是比較靈活的宜猜。
注意
int *p(int a,int b);//這個(gè)p是指向一個(gè)返回值是一個(gè)int *的函數(shù)的指針
內(nèi)存
(程序區(qū)、靜態(tài)存儲(chǔ)區(qū)硝逢、動(dòng)態(tài)存儲(chǔ)區(qū))
靜態(tài)存儲(chǔ)區(qū)
存儲(chǔ)的是全局變量和靜態(tài)變量宝恶,這些變量的空間在程序編譯的時(shí)候就已經(jīng)分配好了。
動(dòng)態(tài)存儲(chǔ)區(qū)
堆區(qū):程序動(dòng)態(tài)分配
棧區(qū):編譯器自動(dòng)分配趴捅,由編譯器自動(dòng)生成和釋放
程序的局部變量存在于(棧)中,全局變量存在于(靜態(tài)區(qū) )中霹疫,動(dòng)態(tài)申請(qǐng)數(shù)據(jù)存在于( 堆)中拱绑。
關(guān)于static和const
const作用: “只讀(readonly)”
static:靜態(tài)變量
關(guān)于static的描述引用自這兒鏈接
1.作用于變量:
用static聲明局部變量-------局部變量指在代碼塊{}內(nèi)部定義的變量,只在代碼塊內(nèi)部有效(作用域)丽蝎,其缺省的存儲(chǔ)方式是自動(dòng)變量或說(shuō)是動(dòng)態(tài)存儲(chǔ)的猎拨,即指令執(zhí)行到變量定義處時(shí)才給變量分配存儲(chǔ)單元,跳出代碼塊時(shí)釋放內(nèi)存單元(生命期)屠阻。用static聲明局部變量時(shí)红省,則改變變量的存儲(chǔ)方式(生命期),使變量成為靜態(tài)的局部變量国觉,即編譯時(shí)就為變量分配內(nèi)存吧恃,直到程序退出才釋放存儲(chǔ)單元。這樣麻诀,使得該局部變量有記憶功能痕寓,可以記憶上次的數(shù)據(jù)傲醉,不過(guò)由于仍是局部變量,因而只能在代碼塊內(nèi)部使用(作用域不變)呻率。
用static聲明外部變量-------外部變量指在所有代碼塊{}之外定義的變量硬毕,它缺省為靜態(tài)變量,編譯時(shí)分配內(nèi)存礼仗,程序結(jié)束時(shí)釋放內(nèi)存單元吐咳。同時(shí)其作用域很廣,整個(gè)文件都有效甚至別的文件也能引用它元践。為了限制某些外部變量的作用域韭脊,使其只在本文件中有效,而不能被其他文件引用卢厂,可以用static關(guān)鍵字對(duì)其作出聲明乾蓬。
總結(jié):用static聲明局部變量,使其變?yōu)殪o態(tài)存儲(chǔ)方式(靜態(tài)數(shù)據(jù)區(qū))慎恒,作用域不變任内;用static聲明外部變量,其本身就是靜態(tài)變量融柬,這只會(huì)改變其連接方式死嗦,使其只在本文件內(nèi)部有效,而其他文件不可連接或引用該變量粒氧。
2.作用于函數(shù):
使用static用于函數(shù)定義時(shí)越除,對(duì)函數(shù)的連接方式產(chǎn)生影響,使得函數(shù)只在本文件內(nèi)部有效外盯,對(duì)其他文件是不可見(jiàn)的摘盆。這樣的函數(shù)又叫作靜態(tài)函數(shù)。使用靜態(tài)函數(shù)的好處是饱苟,不用擔(dān)心與其他文件的同名函數(shù)產(chǎn)生干擾孩擂,另外也是對(duì)函數(shù)本身的一種保護(hù)機(jī)制。
如果想要其他文件可以引用本地函數(shù)箱熬,則要在函數(shù)定義時(shí)使用關(guān)鍵字extern类垦,表示該函數(shù)是外部函數(shù),可供其他文件調(diào)用城须。另外在要引用別的文件中定義的外部函數(shù)的文件中蚤认,使用extern聲明要用的外部函數(shù)即可。
malloc函數(shù)
1糕伐、malloc函數(shù)的聲明:
void *malloc(size_t __size) __result_use_check;
申請(qǐng)一塊大小為_(kāi)_size的連續(xù)的內(nèi)存空間砰琢,如果申請(qǐng)不成功會(huì)返回NULL;
2、calloc函數(shù)的生命:
void *calloc(size_t __count, size_t __size) __result_use_check;
申請(qǐng)__count塊大小為_(kāi)_size的連續(xù)的內(nèi)存空間氯析,塊與塊之間可以不用連續(xù)亏较,但是塊內(nèi)必須是連續(xù)的,如果申請(qǐng)不成功掩缓,則返回NULL雪情;
動(dòng)態(tài)申請(qǐng)的內(nèi)存使用完畢后必須進(jìn)行釋放,而且只能釋放一次:
int *p= (int *)malloc(2*sizeof(int));
free(p);
p=NULL;//釋放內(nèi)存之后最好進(jìn)行置空操作
3.realloc(不常用)
void *realloc(void *__ptr, size_t __size) __result_use_check;
字符串
//字符串
char c[]={'c','h','i','n','a','\0'};
printf("%s \n",c);
從c指向的地址開(kāi)始輸出,直到遇到'\0'結(jié)束你辣。
輸出結(jié)果:
china
另一種定義方式:
//字符串
char c[]="china";
printf("%s \n",c);
注意事項(xiàng)
char p[10]={'c','h','i','n','a'};
printf("%s \n",p);
p[0]='s';
printf("%s \n",p);
輸出結(jié)果:
china
shina
char p1[]={'c','h','i','n','a','\0'};
printf("%s \n",p1);
p1[0]='s';
printf("%s \n",p1);
輸出結(jié)果:
china
shina
char *p2="china";
printf("%s \n",p2);
p2[0]='s';//然而這種情況卻是錯(cuò)誤的巡通,不能完成賦值操作,因?yàn)椤癱hina”存在于常量區(qū)
printf("%s \n",p2);
第三種情況與前兩種有本質(zhì)區(qū)別,前兩種都是分配一塊區(qū)域舍哄,這塊區(qū)域的內(nèi)容是china宴凉,地址是p(或者p1),第三種情況是在常量區(qū)中有一塊區(qū)域表悬,這塊區(qū)域的內(nèi)容是china弥锄,然后讓p2指向了這塊區(qū)域。
所以說(shuō)我們可以把china從常量區(qū)拷貝一份再做修改
char *ppp=(char *)malloc(10*sizeof(char));
strcpy(ppp, "china");
printf("%s\n",ppp);
ppp[0]='s';
printf("%s\n",ppp);
輸出結(jié)果:
china
shina
關(guān)于c語(yǔ)言中的一些字符串處理函數(shù)
函數(shù)名: stpcpy
功 能: 拷貝一個(gè)字符串到另一個(gè)
用 法: char *stpcpy(char *destin, char *source);
程序例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[10];
char *str1 = "abcdefghi";
stpcpy(string, str1);
printf("%sn", string);
return 0;
}
函數(shù)名: strcat
功 能: 字符串拼接函數(shù)
用 法: char *strcat(char *destin, char *source);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char destination[25];
char *blank = " ", *c = "C++", *Borland = "Borland";
strcpy(destination, Borland);
strcat(destination, blank);
strcat(destination, c);
printf("%sn", destination);
return 0;
}
函數(shù)名: strchr
功 能: 在一個(gè)串中查找給定字符的第一個(gè)匹配之處
用 法: char *strchr(char *str, char c);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char string[15];
char *ptr, c = 'r';
strcpy(string, "This is a string");
ptr = strchr(string, c);
if (ptr)
printf("The character %c is at position: %dn", c, ptr-string);
else
printf("The character was not foundn");
return 0;
}
函數(shù)名: strcmp
功 能: 串比較
用 法: int strcmp(char *str1, char *str2);
看Asic碼蟆沫,str1>str2籽暇,返回值 > 0;兩串相等饭庞,返回0
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char *buf1 = "aaa", *buf2 = "bbb", *buf3 = "ccc";
int ptr;
ptr = strcmp(buf2, buf1);
if (ptr > 0)
printf("buffer 2 is greater than buffer 1n");
else
printf("buffer 2 is less than buffer 1n");
ptr = strcmp(buf2, buf3);
if (ptr > 0)
printf("buffer 2 is greater than buffer 3n");
else
printf("buffer 2 is less than buffer 3n");
return 0;
}
函數(shù)名: strncmpi
功 能: 將一個(gè)串中的一部分與另一個(gè)串比較, 不管大小寫(xiě)
用 法: int strncmpi(char *str1, char *str2, unsigned maxlen);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char *buf1 = "BBB", *buf2 = "bbb";
int ptr;
ptr = strcmpi(buf2, buf1);
if (ptr > 0)
printf("buffer 2 is greater than buffer 1n");
if (ptr < 0)
printf("buffer 2 is less than buffer 1n");
if (ptr == 0)
printf("buffer 2 equals buffer 1n");
return 0;
}
函數(shù)名: strcpy
功 能: 串拷貝
用 法: char *strcpy(char *str1, char *str2);
程序例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[10];
char *str1 = "abcdefghi";
strcpy(string, str1);
printf("%sn", string);
return 0;
}
函數(shù)名: strcspn
功 能: 在串中查找第一個(gè)給定字符集內(nèi)容的段
用 法: int strcspn(char *str1, char *str2);
程序例:
#include <stdio.h>
#include <string.h>
#include <alloc.h>
int main(void)
{
char *string1 = "1234567890";
char *string2 = "747DC8";
int length;
length = strcspn(string1, string2);
printf("Character where strings intersect is at position %dn", length);
return 0;
}
函數(shù)名: strdup
功 能: 將串拷貝到新建的位置處
用 法: char *strdup(char *str);
程序例:
#include <stdio.h>
#include <string.h>
#include <alloc.h>
int main(void)
{
char *dup_str, *string = "abcde";
dup_str = strdup(string);
printf("%sn", dup_str);
free(dup_str);
return 0;
}
函數(shù)名: stricmp
功 能: 以大小寫(xiě)不敏感方式比較兩個(gè)串
用 法: int stricmp(char *str1, char *str2);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char *buf1 = "BBB", *buf2 = "bbb";
int ptr;
ptr = stricmp(buf2, buf1);
if (ptr > 0)
printf("buffer 2 is greater than buffer 1n");
if (ptr < 0)
printf("buffer 2 is less than buffer 1n");
if (ptr == 0)
printf("buffer 2 equals buffer 1n");
return 0;
}
函數(shù)名: strerror
功 能: 返回指向錯(cuò)誤信息字符串的指針
用 法: char *strerror(int errnum);
程序例:
#include <stdio.h>
#include <errno.h>
int main(void)
{
char *buffer;
buffer = strerror(errno);
printf("Error: %sn", buffer);
return 0;
}
函數(shù)名: strcmpi
功 能: 將一個(gè)串與另一個(gè)比較, 不管大小寫(xiě)
用 法: int strcmpi(char *str1, char *str2);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char *buf1 = "BBB", *buf2 = "bbb";
int ptr;
ptr = strcmpi(buf2, buf1);
if (ptr > 0)
printf("buffer 2 is greater than buffer 1n");
if (ptr < 0)
printf("buffer 2 is less than buffer 1n");
if (ptr == 0)
printf("buffer 2 equals buffer 1n");
return 0;
}
函數(shù)名: strncmp
功 能: 串比較
用 法: int strncmp(char *str1, char *str2, int maxlen);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char *buf1 = "aaabbb", *buf2 = "bbbccc", *buf3 = "ccc";
int ptr;
ptr = strncmp(buf2,buf1,3);
if (ptr > 0)
printf("buffer 2 is greater than buffer 1n");
else
printf("buffer 2 is less than buffer 1n");
ptr = strncmp(buf2,buf3,3);
if (ptr > 0)
printf("buffer 2 is greater than buffer 3n");
else
printf("buffer 2 is less than buffer 3n");
return(0);
}
函數(shù)名: strncmpi
功 能: 把串中的一部分與另一串中的一部分比較, 不管大小寫(xiě)
用 法: int strncmpi(char *str1, char *str2);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char *buf1 = "BBBccc", *buf2 = "bbbccc";
int ptr;
ptr = strncmpi(buf2,buf1,3);
if (ptr > 0)
printf("buffer 2 is greater than buffer 1n");
if (ptr < 0)
printf("buffer 2 is less than buffer 1n");
if (ptr == 0)
printf("buffer 2 equals buffer 1n");
return 0;
}
函數(shù)名: strncpy
功 能: 串拷貝
用 法: char *strncpy(char *destin, char *source, int maxlen);
程序例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[10];
char *str1 = "abcdefghi";
strncpy(string, str1, 3);
string[3] = '';
printf("%sn", string);
return 0;
}
函數(shù)名: strnicmp
功 能: 不注重大小寫(xiě)地比較兩個(gè)串
用 法: int strnicmp(char *str1, char *str2, unsigned maxlen);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char *buf1 = "BBBccc", *buf2 = "bbbccc";
int ptr;
ptr = strnicmp(buf2, buf1, 3);
if (ptr > 0)
printf("buffer 2 is greater than buffer 1n");
if (ptr < 0)
printf("buffer 2 is less than buffer 1n");
if (ptr == 0)
printf("buffer 2 equals buffer 1n");
return 0;
}
函數(shù)名: strnset
功 能: 將一個(gè)串中的所有字符都設(shè)為指定字符
用 法: char *strnset(char *str, char ch, unsigned n);
程序例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *string = "abcdefghijklmnopqrstuvwxyz";
char letter = 'x';
printf("string before strnset: %sn", string);
strnset(string, letter, 13);
printf("string after strnset: %sn", string);
return 0;
}
函數(shù)名: strpbrk
功 能: 在串中查找給定字符集中的字符
用 法: char *strpbrk(char *str1, char *str2);
程序例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *string1 = "abcdefghijklmnopqrstuvwxyz";
char *string2 = "onm";
char *ptr;
ptr = strpbrk(string1, string2);
if (ptr)
printf("strpbrk found first character: %cn", *ptr);
else
printf("strpbrk didn't find character in setn");
return 0;
}
函數(shù)名: strrchr
功 能: 在串中查找指定字符的最后一個(gè)出現(xiàn)
用 法: char *strrchr(char *str, char c);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char string[15];
char *ptr, c = 'r';
strcpy(string, "This is a string");
ptr = strrchr(string, c);
if (ptr)
printf("The character %c is at position: %dn", c, ptr-string);
else
printf("The character was not foundn");
return 0;
}
函數(shù)名: strrev
功 能: 串倒轉(zhuǎn)
用 法: char *strrev(char *str);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char *forward = "string";
printf("Before strrev(): %sn", forward);
strrev(forward);
printf("After strrev(): %sn", forward);
return 0;
}
函數(shù)名: strset
功 能: 將一個(gè)串中的所有字符都設(shè)為指定字符
用 法: char *strset(char *str, char c);
程序例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[10] = "123456789";
char symbol = 'c';
printf("Before strset(): %sn", string);
strset(string, symbol);
printf("After strset(): %sn", string);
return 0;
}
函數(shù)名: strspn
功 能: 在串中查找指定字符集的子集的第一次出現(xiàn)
用 法: int strspn(char *str1, char *str2);
程序例:
#include <stdio.h>
#include <string.h>
#include <alloc.h>
int main(void)
{
char *string1 = "1234567890";
char *string2 = "123DC8";
int length;
length = strspn(string1, string2);
printf("Character where strings differ is at position %dn", length);
return 0;
}
函數(shù)名: strstr
功 能: 在串中查找指定字符串的第一次出現(xiàn)
用 法: char *strstr(char *str1, char *str2);
程序例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *str1 = "Borland International", *str2 = "nation", *ptr;
ptr = strstr(str1, str2);
printf("The substring is: %sn", ptr);
return 0;
}
函數(shù)名: strtod
功 能: 將字符串轉(zhuǎn)換為double型值
用 法: double strtod(char *str, char **endptr);
程序例:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char input[80], *endptr;
double value;
printf("Enter a floating point number:");
gets(input);
value = strtod(input, &endptr);
printf("The string is %s the number is %lfn", input, value);
return 0;
}
函數(shù)名: strtok
功 能: 查找由在第二個(gè)串中指定的分界符分隔開(kāi)的單詞
用 法: char *strtok(char *str1, char *str2);
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
{
char input[16] = "abc,d";
char *p;
/* strtok places a NULL terminator
in front of the token, if found */
p = strtok(input, ",");
if (p) printf("%sn", p);
/* A second call to strtok using a NULL
as the first parameter returns a pointer
to the character following the token */
p = strtok(NULL, ",");
if (p) printf("%sn", p);
return 0;
}
函數(shù)名: strtol
功 能: 將串轉(zhuǎn)換為長(zhǎng)整數(shù)
用 法: long strtol(char *str, char **endptr, int base);
程序例:
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
char *string = "87654321", *endptr;
long lnumber;
/* strtol converts string to long integer */
lnumber = strtol(string, &endptr, 10);
printf("string = %s long = %ldn", string, lnumber);
return 0;
}
函數(shù)名: strupr
功 能: 將串中的小寫(xiě)字母轉(zhuǎn)換為大寫(xiě)字母
用 法: char *strupr(char *str);
程序例:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *string = "abcdefghijklmnopqrstuvwxyz", *ptr;
/* converts string to upper case characters */
ptr = strupr(string);
printf("%sn", ptr);
return 0;
}
函數(shù)名: swab
功 能: 交換字節(jié)
用 法: void swab (char *from, char *to, int nbytes);
程序例:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char source[15] = "rFna koBlrna d";
char target[15];
int main(void)
{
swab(source, target, strlen(source));
printf("This is target: %sn", target);
return 0;
}
PS:isalpha()是字符函數(shù)戒悠,不是字符串函數(shù),
isalpha
原型:extern int isalpha(int c);
用法:#include <ctype.h>
功能:判斷字符c是否為英文字母
說(shuō)明:當(dāng)c為英文字母a-z或A-Z時(shí)舟山,返回非零值绸狐,否則返回零。
舉例:
// isalpha.c
#include <syslib.h>
#include <ctype.h>
#include <stdio.h>
main()
{
int c;
clrscr(); // clear screen
printf("Press a key");
for(;;)
{
c=getchar();
clrscr();
printf("%c: %s letter",c,isalpha(c)?"is":"not");
}
return 0; // just to avoid warnings by compiler
}