今天的主要内容是字符串与指针
将指针指向字符串,则形成了一个较为灵活的字符串指针的操作,用指针指向字符串,和指针指向数组是基本一致,
不同点:唯一不同点在于如何判断指针指向数组,或字符串的结束位置。
当指针指向数组是判断数组的结束是由用户控制,就是由数组的长度决定。
儿字符串的优势结束标志是’\0’来判定字符串结束。
下面的的代码来说明一个小问题:
int i, j;
char ch1[] = "i love China";
char *p;
p = ch1;
printf("请输入i到j之间的字符");
scanf_s("%d,%d", &i, &j);
*(p + j) = '\0';
printf("%s\n", p + i);
system("pause");
也即是说通过指针来获取数组的位置,可以通过指针的数组的位置来获取字符串的长度,可以通过i,j\来获取起始位置,终点位置。
字符串指针作为函数参数
我的理解,数组,指向字符串首地址的字符指针也可以作为函数的参数。
总结下这周的重要内容
C语言最强悍的的语言—–指针
1,首先要讲的是内存还有地址*强调内容*
int a=1;
int *p;
p=&a;
这句简单的 代码就是取a的地址给p,p就可以打印a的值。
2,指针与指针变量。
2-1指针:一个变量的地址。
2-2指针变量:专门存放变量地址的变量叫指针变量。
*3, 指针变量的声明与初始化。*
int i=10;
int *p; //指针变量的声明
*p=1;// 指针必须先赋值在操作
*4,指针变量的取地址操作。*
int num ,*p,用&取地址
*5指针变量占据的内存空间*
指针变量声明后,编译器为其开辟一定的内存空间,指针变量也占有一定的内存变量。
*6指向指针的指针,*
指针变量也是指针,占有空间,也有地址,可以用一个指针指向它,也就是二级针。
double num ;
double *pN=num;
double **ppN=&pN;
*7指针的算数运算,*
指针是一种特殊的变量,但是指针的运算还是局限在于加减算法。
指针的运算:
p=&a; //将变量a的地址给p;
p=array; //将数组的首地址给p;
p=&array[i] //讲数组的地址p;
指针的算数运算:
int *p,arr_num[8]; //定义数组还有指针
p=&arr_num[0]; //取数组的首地址
p++; // 地址做运算 可以看到移动的单位
*8指针与数组–指向数组元素的变量*
例如: int array[10]; int *p;
p=&array[0]; //等价于p=array;
或者 int *p=&array[0];
或者 int *p=array;
数组名是表示数组首地址的地址常量
注意:数组名a不代表整个数组,只代表数组的首元素的地址
“p=a“的作用是把a数组的首元素的地址赋给指针变量p
不是把数组中每个元素的地址给p;
*9指针与多维数组*
也就是指针与二维数组
也就是有一个公式 ((a+i)+j)=a[i][j];
行指针代表的是a[0] 到a[1] a[3]
列指针代表的是a[0]到 a[0]+1;a[0]+2 ;a[0]+3
*10数组作为函数的参数也是指针*
实参数组名是指针常量,但是形参数组名是安指针变量处理
在函数调用进虚实结合后,他的值就是是实参数组的首地址。
在函数执行期间,形参数组可以再被赋值,
void fun(arr[],int n){
printf("%d\n",*arr);
arr =arr +3;
printf("%d\n",*arr);
}
*11指针数组函数*
指向函数的指针可以作为函数参数,把函数的入口地址传递给形参,这样就可以在被调用的函数中使用实参函数。
*12函数指针–函数的返回值*
函数可以返回各种类型,也可以返回指针的数据,就是地址,
*13字符串的操作*
首先注意的是字符串数组‘\0’表示结尾
*14字符串数组的定义还有初始化,*
char 数组名【常量表达式】
char a[100]; //定义·
char c[5]={‘a’,’b’,’c’,’d’,’e’};
如果初始化时初值大于数组长度,会报错。
如果初始化时初值小于数组长度,系统会为剩余元素自动赋值为‘\0’;
*15字符串指针输出字符*
char str[20]; str=’ I love China’;/错误的表达方式
char *cp; cp=’ I love China’; // 正确的
str 是地址常量 ;cp是地址变量
16字符串与字符数组的关系
17字符串的大写函数strupr
*18字符串复制的的函数strcpy*
*19字符串比较函数strcmp*
*20字符串连接函数strcat*