1、指针变量支持运算:
一个指针加上一个整数N,实际上是加上了N个指针类型字节大小的地址。例如:
int *p_num = NULL;
p_num + 10 ; 就相当于加上10个整型类型大小(4字节)的地址。
两个同类型的指针进行相减,得到一个整数,这个整数代表,这两个地址有多少个这种类型大小的单位。
也许double的两个指针相减和int的两个指针相减得到的整数一样,但是代表的字节数不同。
*(p_num + 10),取这个地址上的内容。
2、const 关键字和指针:
int num = 10;
const int *p_num = #
const是用于修饰常量的,一旦初始化完毕,就不能修改它的内容。
这种形式的修饰,是对指针所指地址的内容修饰,表示不能通过指针去修改,指针所指的地址上的内容。不过可以通过 num 取修改内容。
int *const p_num = #
这种形式修饰的是指针本身,表示不能修改指针所指的地址。
3、无类型的字符指针:
void *p_num = NULL;
无类型指针,不能使用*运算符,不能做加减整数的操作,不能和其他指针进行减运算。
但是它可以指向任意地址。如果要使用 * 运算符,需要先对该指针进行强制转换: *(char *)p_num
4、指针作为函数形式参数和函数返回值:
函数的局部参数是不能在函数外使用的,但是如果在函数执行期间,执行了另一个函数,另一个函数可以通过访问这个局部变量的地址来操作这个局部变量的值。
最常见的做法,就是把局部变量的地址作为实际参数传给另一个函数,另一个函数的形式参数用同类型的指针。
声明指针形式的形式参数的时候,如果确定不会对该局部变量的值进行改动,那么就对这个形式参数加上const关键字
被调用的函数,可以返回一个地址数据,这样调用函数就可以使用被调用函数的数组,但是这里有一个问题。
被调函数局部变量会随着函数的结束而被计算机释放,如果这个时候返回一个地址,调用函数拿到这个地址之后,地址内的数据很有可能已经异常。
可以通过static关键字对被调用函数的局部变量进行声明。延长其生命周期。
5、字符串:
一串文字信息,在内存的存储地址上连续并且以空字符 '\0' 做结尾就叫做字符串。
所有的字符串都可以用字符类指针表示。
字符串的字面值:"abc"
字符串字面值,会返回一个地址,这个地址是首个字符的地址,编译器会在字符串字面值的末尾加上'\0'字符。
字符串字面值的内容是不能修改的。比方说,用一个字符类指针指向一个字符字面值,试图通过指针修改字面值内容,就会导致编译时报错。
另一种形式的字符串是字符数组:char str[10]
char str[10] = {'a','b','\0'};
char str[] = "ab";
第一种形式的字符串声明方式,要明确在末尾填写空字符,
第二种形式,编译器会自动填充空字符,
两种方式,都要求数组必须有预留的位置给空字符。
字符数组里的字符串是可以更改内容的。
6、操作字符串的标准函数:
printf("%s",char*);
打印字符串;
void sprintf(char*,"占位符",数据);
将其他类型的数据变成字符串记录到字符数组中。
void sscanf(char*,"占位符",变量名);
按照格式从字符串里获得数字并记录到存储区
包含在stdlib.h头文件中:
int atoi(char*);
把字符串开头的数字转成整型,返回值就是转换结果。
double atof(char*);
把字符串开头的浮点数,转换成双精度浮点类型。
包含在string.h头文件中:
int strlen(char*);
用来统计字符串里有效个数,碰到第一个空字符前的字符个数。和sizeof不同,sizeof统计的是这个字符数组所占内存,只要声明了字符数组,它就是确定的。
char* strcat(char*,char*);
将第二个参数的字符串追加到第一个字符串的末尾,返回值就是第一个字符串,由于字符串字面值无法修改大小,所以第一个参数不能是字符串字面值,第二个可以。如果追加之后的字符串超过了第一个字符数组的容量,就会继续向内存中写数据,破坏其他数据。很有可能会导致程序停止。
char* strncat(char*,char*,int);
和上述函数功能类似,多了一个参数,这个参数用于表示第一个字符串还有多少个空余位置,执行函数的时候,第一个字符串追加到空余位之后就不再增加。
int strcmp(char*,char*);
比较两个字符串的大小,比较规则是比较两个字符串第一个不同的字符的ASCII码值,ASCII码值大的更大。
1:表示前面一个字符串大于后面一个字符串
0:表示两个字符串相等
-1:表示前面一个字符串小于后面一个字符串
int strncmp(char*,char*,int);
和上述函数功能类似,多的一个参数表示,只比较两个字符串的前n个字符。
char* strcpy(char*,char*);
用于将后面一个字符串/字符串字面值,拷贝到第一个字符数组中,返回值就是复制完毕之后的第一个字符数组。如果第二个字符串的长度超出了第一个字符数组的范围,将会继续向内存中写数组,破坏后面的数据,可能导致程序异常。
char* strncpy(char*,char*,int);
和上述的函数功能类似,多余的参数表示,只复制第二个字符串的前n个字符到第一个字符数组,只要n小于第一个字符数组的范围,就不会有问题。当然要注意复制完毕后第一个字符数组内的空字符情况。
char* memset(char*,char,int);
将一个字符复制在一个字符数组的多个位置。
char* strstr(char*,char*);
在前面一个字符串里查找后面一个字符串,如果找到了,将返回第一字符串中和第二个字符串的首字符一致的字符的地址,如果找不到,就返回NULL。