指针和数组相关概念
文档不知道从哪搞的,基础知识,觉得有用的可以看看,留存.
有侵权的内容,请及时告知,谢谢!
指针和数组相关概念
*************************************************
字符与字符串的区别:单引号字符其实就是代表ASCII码的整数,而字符串代表了无名数组起始的指针
指针与数组1:任何一个数组下标运算都等同于一个对应的指针运算;对数组只能知道数组的大小,和获得指向下标为0的指针,intcalendar[12][31];sizeof(calendar)=12x31xsizeof(int);
int *p[],指针数组,p的类型为int *,每个元素都是一个指针
int (*p)[],数组指针,p=数组名。
P=calendar,是非法的,p是指向整型的指针,calendar是指向数组类型的指针
int calendar[12][31];
int (*monthp)[31];
monthp = calendar;
指针与数组2:
数组的名的值是一个常指针,不能试图将一个地址赋值给数组名;
在函数参数的声明中,数组名被编译器当作指向该数组第一个元素的指针
指针和数组的相同与不同;
用malloc为字符串分配存储空间时的注意事项
void *malloc(unsignedint size);//成功的话,返回的是一个指向分配域起始地址的指针,失败的话返回空指针(NULL)
extern void*realloc(void *mem_address, unsigned int newsize) 指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。//新的大小一定要大于原来的大小不然的话会导致数据丢失
void free(void *p);//及时释放p
作为常数的数组声明(c缺陷与陷阱3.3节.在其它部分有包含该节的知识点,了解or略过)
字符串常量=指针常量,指向第一个字符的指针,*“”---指向第一个元素
用字符串常量初始化指针和数组
定义指针时,编译器并不为指针所指的对象分配空间,它只是分配指针本身的空间,除非定义时用字符串常量(有且只有)初始化
二维数组下标操作的相关概念
指向一维、二维数组的指针,int (*p)[10] //优先级的问题,必须加括号,否则定义成了指针数组
array_name和&array_name的异同
前者是指向数组中第一个元素的指针,后者是指向整个数组的指针。
数组作为函数的参数时,不能通过sizeof运算符得到该数组的大小!!!!!!
函数的数组参数相当于指向该数组第一个元素的指针
在C语言中字符串总是以ASCII字符NUL(‘\0‘)结束,而一个指针数组总是以空指针结束NULL
用strlen()求字符串的长度
尽管你不能改变一个数组名的值,但是strings是一个数组参数,相当于一个指针
sizeof()是一个运算符,不是函数
对于返回类型为无符号的函数(strlen()、sizeof()),最好将结果转换成整型( (int)strlen(…)、(int)sizeof(…) )
‘char **’ 和 ‘const char **’的兼容性问题
空指针相关的问题
我们将0赋值给一个指针变量时,决不能企图使用该指针指向的地址的内容
if(p==(char *)0)合法的,if(strcmp(p,(char *)0)==0),非法操作,strcmp库函数隐含查找指针0的内容
NULL和NUL的区别
NULL是在<stddef.h>头文件中专门为空指针定义的一个宏。NUL是ASCII字符集中第一个字符的名称,NULL指针进行解引用操作是非法的
未初始化的指针和NULL指针的区别
int *p=12,把12存取p指向的位置,但是p所在的地址未知,so initializing first……
NULL指针并未指向任何内容,因此对其解引用是非法的
理解函数的声明,float (*p)(),p是指向返回值为浮点型的函数指针,(float (*)()),是一个返回值为浮点型函数指针的类型转换符。 (*(void(*)())0)()
函数参数的传值调用,数组名的值其实就是个指针,传递给函数的就是一份拷贝,实参就是个指针,sizeof string 指向字符指针的长度
数组参数的地址和数组参数的第一个元素的地址是不一样的
函数指针,&是可选的,函数名在使用时总是被编译器当做函数指针,
int f(int); int(*pf)(int)=&f; int(*pf)(int)=f; int ans; ans=f(15)=(*pf)(15)=pf(15)
作为函数参数的多维数组
强制类型转换相关概念一个对象的声明,它的类型就是想要转换的结果类型;删去标识符以及任何类似extern之类的存储限定符,并把剩余的内容放在一对括号里面;把第二步产生的内容放在需要进行类型转换的对象的左边
可变参数相关问题
malloc( size )、calloc(numelement,element_size)、realloc()区别是calloc()函数会返回一个由某种对象组成的数组,但malloc()函数只返回一个对象,malloc不能初始化,而calloc可以;realloc函数用于修改一个原先已经分配的内存块的大小
1、在请求动态内存分配时,要检查所请求的内存是否成功分配。
2、操作内存时,不要超过动态分配的内存的边界。对分配的内存之外的区域进行访问可能会破坏别的数据,
产生一些莫名其妙的很难发现的bug。
3、传递给free的指针必须是一个从malloc、calloc、realloc函数返回的指针。
4、动态分配的内存必须整块一起释放,不允许释放一块动态分配的内存的一部分(realloc函数可以缩小一块动
态分配的内存,有效地释放它尾部的部分内存)
在程序退出main()函数之后,还有可能执行一部分代码吗? 库函数atexit(函数名)
第一: 由atexit()函数指定的要在程序终止前执行的函数要用关键字void说明,并且不能带参数;
第二: 由atexit()函数指定的函数在入栈时的顺序和调用atexit()函数的顺序相反,即它们在执行时遵循后进先出(LIFO)的原则。
总线错误和段错误相关概念总线错误几乎都是由于未对齐的读或写造成的; 段错误通常是由于解除引用一个未初始化或非法值的指针引起的
数字和字符串之间转换相关的函数
*************************************************
怎样判断一个字符是数字、字母或其它类别的符号?ctype.h库函数里
怎样将数字转换为字符串?
怎样将字符串转换为数字?
字符串以及内存操作相关函数
*************************************************
字符串拷贝和内存拷贝函数:strcpy(拷贝字符串) 定义函数:char *strcpy( char *dest, const char *src );
strncpy(拷贝字符串) 定义函数:char *strncpy( char *dest, const char *src, size_t n );
strcpy
strncpy
memcpymemcpy(拷贝内存内容) 定义函数:void * memcpy( void * dest, const void *src, size_t n ) s
trcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束‘\0‘而结束
memmove memmove(拷贝内存内容) 定义函数:void *memmove(void *dest,const void *src, size_t n ); src和dest所指的内存区域重叠时,memmove()仍然可以正确的处理,不过执行效率上会比使用memcpy()略慢些
memccpy:void * memccpy( void *dest,const void *src, int c, size_t n ); 与memcpy()不同的是,memccpy()会在复制时检查参数c是否出现,若是则返回dest中值为c的下一个字节地址。该函数返回指向dest中值为c的下一个字节指针。返回值为NULL表示在src所指内存前n个字节中没有值为c的字节。
bcopy
字符串和内存数据比较函数:字符串大小的比较是以ASCII 码表上的顺序来决定
strcmp
strcasecmp
strncasecmp
memcmp
strcoll
bcmp
连接字符串的函数:
strcat
strncat
查找字符/字符串的函数:
strstrchar *strstr( const char *s1, const char *s2 );
strstr()会从字符串s1中搜寻字符串s2,并将第一次出现的地址返回。返回指定字符串第一次出现的地址,否则返回NULL
strchrchar *strchr( const char *s, int c );
strchr()用来找出参数s字符串中第一个出现的参数c地址,然后将该字符出现的地址返回。如果找到指定的字符则返回该字符所在地址,否则返回NULL
strrchr查找字符串中最后出现的指定字符
memchr在某一内存范围中查找一特定字符) void *memchr( const void*s, int c, size_t n );
其它相关的函数:
index查找字符串中第一个出现的指定字符
rindex查找字符串中最后一个出现的指定字符
strlen不包括结束字符"\0"
strdup
memset将一段内存空间填入某值) void * memset (void *s ,intc, size_t n );
将参数s所指的内存区域前n个字节以参数c填入,返回指向s的指针。参数c虽声明为int,但必须是unsigned char,所以范围在0到255之间。
bzero
strspn
strcspn
strpbrk
strtok
数据结构及算法相关函数
qsort()
bsearch()
lsearch(线性搜索)
lfind(线性搜索)
srand(设置随机数种子)
rand(产生随机数)
OTHER
*************************************************
什么是标准预定义宏?
断言 assert(表达式) 相关概念
连接运算符“##”和字符串化运算符"#"有什么作用?
连接运算符“##”可以把两个独立的字符串连接成一个字符串。字符串化运算符"#"能将宏的参数转换为带双引号的字符串,
define DEBUG_VALUE(v) printf(#v"is equal to %d. \n", v)
int x=20;
DEBUG_VALUE(x);--à>>>>x is equal to20
注释掉一段代码的方法#if0 statement #endif
Typedef相关概念
= 不同于 ==
词法分析中的“贪心法”
运算符的优先级问题
变量的存储类型及初始化相关概念
左值和右值相关的概念
变量的值和类型相关的概念
怎样删去字符串尾部的空格?
怎样删去字符串头部的空格?
怎样打印字符串的一部分?
结构的自引用
结构的存储分配
边界计算与不对称边界
整数溢出
返回整数的getchar函数
更新顺序文件
随机数的相关概念
用递归和迭代两种办法解fibonacci
原文:http://blog.csdn.net/linglongqiongge/article/details/45195199