指针运算
*p++
- 取出指针p所指的那个数据来,之后顺便把p移到下一个位置去
- *的优先级虽然高,但是没有++高
- 常用于数组类的连续空间操作
- 在某些CPU上,这可以直接被翻译成一条汇编指令
#include<stdio.h>
int main(){
int a[] = {1,2,3,4,5};
int i=0;
for(i=0;i<sizeof(a)/sizeof(a[0]);i++){
printf("%d ",a[i]);
}
return 0;
}
指针的类型
- 无论指针指向什么类型,所有的指针的大小都是一样的,因为都是地址
- 指向不同类型数据的指针最好不要直接互相赋值,避免不必要的错误
指针的类型转换
-
void*表示不知道指向什么类型数据的指针,计算时和char*相同 -
指针也可以强制转换类型 int *p = &i;
void *q = (void\*)p;
-
指针的转换类型没有改变p指向的变量的类型,只是改变了指针的类型
动态分配内存
在c99之后,直接使用变量定义数组所占空间,但是在之前需要使用malloc函数申请指定大小的空间,并且使用完后要使用free释放空间(谨记)
int *a = (int*)malloc(n*sizeof(int));
free(a);
练习:使用malloc函数构建数组
#include<stdio.h>
#include<stdlib.h>
int main(){
int n = 5;
int i = 0;
int s = 0;
int *a = (int*)malloc(n*sizeof(int));
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
free(a);
return 0;
}
练习:测试可以向系统申请的最大空间
#include<stdio.h>
#include<stdlib.h>
int main(){
int *p;
int c = 0;
while((p=malloc(100*1024*1024))){
c++;
}
printf("系统最大申请空间:%dM",100*c);
return 0;
}
字符串
- 以0结尾的一串字符,0和’\0’是一样的
- 0标志字符串的结束,但它不是字符串的一部分,计算字符串的长度时不包含这个0
- 字符串以数组的形式存在,以数组或指针的形式访问
- string.h里有很多字符串的函数
字符串变量
- char *str = “Hello”;
- char word[] = “Hello”;
- char line[10] = “Hello”;
字符串常量
- “Hello”,它会被编译器变成一个字符数组放在某处,这个数组的长度为6,其中字符串内容占5个字节,但是结尾还有表示结束的0
- 两个相邻的字符串常量会被自动连接起来
总结
- C语言的字符串是以数组的形态存在的
- 不能用运算符对字符串做运算
- 通过数组的方式可以遍历字符串
- C语言的字符串特殊的地方是字符串常量可以用来初始化字符数组
创建字符串
- 使用指针创建字符串:char *s = “hello”;等价于 const char *s = “hello”;
- 使用数组创建字符串:char s[] = “hello”;
- 它们的区别在于,使用指针创建的字符串只能读,使用数组创建的字符串不仅可以读,而且可以修改。
#include<stdio.h>
int main(){
char s[] = "Hello";
printf("%c\n",s[0]);
printf("Hello字符串的长度:%d,因为它还有末尾表示字符串的标志位0,也占一个字节",sizeof(s)/sizeof(char));
return 0;
}
char*是否是字符串?
- 字符串可以用char*的形式表示
- char*并不一定是字符串,有可能是指向字符的指针
- 只有char*指向的字符数组有结尾的0时,才能说它所指的是字符串
字符串输入输出
char string[8];
scanf("%s",string);
printf("%s",string);
字符串可以用%s来输入和输出
#include<stdio.h>
int main(){
char s[6];
scanf("%5s",s);
printf("%s",s);
return 0;
}
安全的输入
如何避免输入的字符串数量越界问题,我们可以在%s中间加入最大字符的数量,来避免这个问题
字符串数组
两种方式
-
char a\[][10] = {"Hello","World"};
-
char *a[] = {"Hello","World"};
第一种方式是指,创建一个字符串数组,每个元素的最大长度不能超过10。
第二种方式是指,创建一个字符串数组,每个元素都是一个指向一个字符串的指针变量。
单字符输入输出
putchar
-
int putchar(int c);
-
向标准输入写一个字符 -
返回写了几个字符,EOF (-1) 表示写失败
#include<stdio.h>
int main(){
int ch;
while((ch = getchar())!=EOF){
putchar(ch);
}
return 0;
}
|