11.11
计算字串的长度
#include<stdio.h>int str_len(char str[]){int i=0;while(ste[i]!='\0'){i++;}return i;}int main(){char str_[i]="hello world"; //当字串数字恰好等于不加'\0'是的长度时,即i=11时,语法合法,但此阵列不能运用于函式中。当i=15时,系统将会自动补'\0'。printf("length:%zu\n",sizeof(str)); //有的版本用%u或%luprintf("length:%d\n",str_len(str));return 0;}
输入一段字串
#include<stdio.h>void readch(char[]);int main(){char str[15];readch(str);printf("%s\n",str);return 0;}void readch(char str[]){int i=0;while(1){scanf("%c",&str[i]);if(str[i]=='\n')break;i++;}str[i]='\0'; //将\n换为\0}
当输入字串时,没有立马存入记忆体中,而是先存在stdin中,当按enter后,scanf会去stdin中找新录入的东西
解决溢位的问题
#include<stdio.h>void readch(char[],int);int main(){char str[15];readch(str,14);printf("%s\n",str);return 0;}void readch(char str[],int){int i=0;for(i=0;i<n;i++){scanf("%c",&str[i]);if(str[i]=='\n')break;}str[i]='\0';}
但是scanf会忽视空格
当输入格式错误时
#include<stdio.h>int main(){int num;whilr(scanf("%d",&number)!=1){printf("Error: invalid input\n");}printf("%d\n",num);return 0;}
但失败后,错误的格式仍然留在stdin中,再次输入时仍然会错误
字串在函式中传递时也不能复制,且也不能a=v直接将字串赋值
指标
指标是一种资料型别,用来存储记忆体位址
宣告语法
int *a; 存储int值得位置
int **b; 存储*b的位置即存储存储b位置的位置
double *c=&d 找出d的位置存储在*c里
取址运算子:&
间接运算子:*
A=8
*Aaddr 中*是一个运算,取Aaddr所存的记忆体的位址上的值,即取得以该记忆体位址起始得变数
即*Aaddr==8
Aaddr=9 时,A的值也会改变,即此时A==9
*&*&*&*&*&A *&可以相消
当函式中复制的是位置是,就可以把本尊改掉
#include<stdio.h>void swap(int *a,int *b);int main(){int a=3,b=5;swap(&a,&b);printf("%d,%d",a,b);return 0;} //交换两个值void swap(int *a,int *b){int t;t = *a;*a = *b;*b = t;}
#include<stdio.h>void sort(int *,int *);void swap(int *,int *);int main(){int a,b;scanf("%d %d",&a,&b);sort(&a,&b);printf("%d,%d\n",a,b);return 0;}void sort(int *a,int *b){ //排序if(*a>*b){swap(a,b);}}void swap(int *a,int *b){int t;t = *a;*a = *b;*b = t;}
能复制值就不要复制位置
int a[5];&a[0]+1==&a[1];&a[1]-1==&a[0];&a[0]+&a[1]; //不合法&a[5]-&a[2]==3; //合法,表示有几个间隔
阵列性别可隐形转换为该阵列第一个元素记忆体位址的指标
int v[5];int *n=v;n ==&v[0]; *n ==v[0];// *n=0即v[0]=0n+1==&v[1]; *(n+1)==v[1];n+2==&v[2]; *(n+2)==v[2];
循序存取阵列元素
#include<stdio.h>int main(){intv[5]={1,2,3,4,5};int *n=v;while(n!=){printf("%d\n",*n++); //*(p++)}return 0;}
a[b]就是*(a+b)阵列在函式间的传递就是利用次
int v[5];int *n=v;n[0]==*n; //等同于v[0]n[1]==*(n+1);
int main(){int v[5];int *p=v;while(p!=v+5){ //v+5:v隐形转型成了指标,就相当于&v[5]*p++=0;}return 0;}
双引号可直接隐形转型为指标
指标与字符串
char strA[]="test"; //宣告了一个字串
char *strB = "test"; //没有宣告,直接取了地址,系统会自动分配一个位置来存储这个字串
strA[0] ='T';
strB[0] ='T'; // 是未定义行为,因为是系统给分配的空间,只能读取,不能改动,但能整串换掉
strA ="Test"; //编译失败,,阵列不能直接赋值,阵列变数不能放到等号的左边
strB ="Test"; //会在存储一份,而不是覆盖原来的
const修饰字
资料型别被const修饰的变数在初始化之外不能再被赋值
const int b = 5;
const int b[3]={5,6,7};
