------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1.字符串
1)C语言中本来没有字符串的存在,但是因为指针的存在,对字符串的处理非常的得心应手。
字符串可以看做是一个字符数组,字符串字量没有统一的长度,在编译的时间被编译器加上了一个‘\0’,按照数组的方式储存。
2)\0 的作用
.字符串结束的标记
.printf("%s", name2);
会从name2这个地址开始输出字符,直到遇到\0为止
3)字符串长度的计算
strlen函数声明在string.h文件中
strlen函数:计算字符串长度
.计算的是字符数,并不是字数。一个汉字算作3个字符
.计算的字符不包括\0
.从某个地址开始数字符的个数,直到遇到\0为止
4)编写一个函数char_contains(char str[],char c),如果字符串str中包含字符c则返回数值1,否则返回数值0
#include
#include
int char_contains(char str[], char c);
int main()
{
//int result = char_contains("itc8ast", '8');
char name[] = "itcast";
int result = char_contains(name, 'o');
printf("%d\n", result);
return 0;
}
// "itc" '7'
int char_contains(char str[], char c)
{
int i = -1;
/*
i 3
str[++i] 'c'
c '7'
*/
// 1.遍历整个字符串
while ( str[++i] != c && str[i] != '\0' ) ;
//return str[i] == '\0' ? 0 : 1;
return str[i] != '\0';
}
2.指针
1)指针的定义格式
变量类型 * 变量名;
int *p;
指针变量p前面的int:指针变量p只能指向int类型的数据
2)指针变量只能存储地址
3)指针就一个作用:能够根据一个地址值,访问对应的存储空间
4)指针变量p指向了变量a
int *p;
int a = 90;
// 指针变量p指向了变量a
p = &a;
5)定义变量时的*仅仅是一个象征,没有其他特殊含义
6)任何指针都占用8个字节的存储空间
7)指针的使用注意
1>不建议的写法, int *p只能指向int类型的数据
int *p;
double d = 10.0;
p = &d;
2>指针变量只能存储地址
int *p;
p = 200;
3>指针变量未经过初始化,不要拿来间接访问其他存储空间
int *p;
printf("%d\n", *p);
4>不正确的写法
int a;
a = 10;
*p = &a;不正确的写法
p = &a;
5)指向指针的指针
#include
int main()
{
int a = 10;
int *p = &a;
int **pp = &p;
// a = 20;
// *p = 20;
/*
(*pp) == p
*(*pp) == *p = a
**pp == *p = a
*/
**pp = 20;
printf("%d\n", a);
//int ***ppp = &pp;
/*
char a2 = 'A';
char *p2 = &a2;
*/
return 0;
}
6)指针的内存分析图
8)清空指针
1>p =0;
2>p = NULL;
清空指针后,不能再间接访问其他存储空间
3.指针和数组
1)数组元素的访问方式
int ages[5];int *p;p = ages;1> 数组名[下标] ages[i]2> 指针变量名[下标] p[i]3> *(p + i)
2)指针变量+1,地址值究竟加多少,取决于指针的类型
int * 4char * 1double * 8
使用指针遍历数组
- #include <stdio.h>
- int main()
- {
- int ages[5] = {10, 9, 8, 67, 56};
- intint *p;
- // 指针变量p指向了数组的首元素
- p = &ages[0];
- // 数组名就是数组的地址,也是数组首元素的地址
- //p = ages;
- /*
- p ---> &ages[0]
- p + 1 ---> &ages[1]
- p + 2 ---> &ages[2]
- p + i ---> &ages[i]
- */
- for (int i = 0; i<5; i++) {
- printf("ages[%d] = %d\n", i, *(p+i));
- }*/
1)数组元素的访问方式
int ages[5];int *p;p = ages;1> 数组名[下标] ages[i]2> 指针变量名[下标] p[i]3> *(p + i)
2)指针变量+1,地址值究竟加多少,取决于指针的类型
int * 4char * 1double * 8
使用指针遍历数组
- #include <stdio.h>
- int main()
- {
- int ages[5] = {10, 9, 8, 67, 56};
- intint *p;
- // 指针变量p指向了数组的首元素
- p = &ages[0];
- // 数组名就是数组的地址,也是数组首元素的地址
- //p = ages;
- /*
- p ---> &ages[0]
- p + 1 ---> &ages[1]
- p + 2 ---> &ages[2]
- p + i ---> &ages[i]
- */
- for (int i = 0; i<5; i++) {
- printf("ages[%d] = %d\n", i, *(p+i));
- }*/
4.指针与字符串
1)数组元素的访问方式
int ages[5];int *p;p = ages;1> 数组名[下标] ages[i]2> 指针变量名[下标] p[i]3> *(p + i)
2)指针变量+1,地址值究竟加多少,取决于指针的类型
int * 4char * 1double * 8
使用指针遍历数组
- #include <stdio.h>
- int main()
- {
- int ages[5] = {10, 9, 8, 67, 56};
- intint *p;
- // 指针变量p指向了数组的首元素
- p = &ages[0];
- // 数组名就是数组的地址,也是数组首元素的地址
- //p = ages;
- /*
- p ---> &ages[0]
- p + 1 ---> &ages[1]
- p + 2 ---> &ages[2]
- p + i ---> &ages[i]
- */
- for (int i = 0; i<5; i++) {
- printf("ages[%d] = %d\n", i, *(p+i));
- }*/
定义字符串的2种方式
1> 利用数组
1> 利用数组
char name[] = "itcast";* 特点:字符串里面的字符是可以修改的* 使用场合:字符串的内容需要经常修改
2> 利用指针
char *name = "itcast";//指针变量name指向字符串的首字符* 特点:字符串其实是一个常量字符串,里面的字符是不能修改* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
5.指向函数的指针
1)定义指向函数的指针
double (*p)(double, char *, int);p = haha;
或者
double (*p)(double, char *, int) = haha;
2)如何间接调用函数
1> p(10.7, "jack", 10);2> (*p)(10.7, "jack", 10);
- #include <stdio.h>
- void test()
- {
- printf("调用了test函数\n");
- }
- int main()
- {
- // (*p)是固定写法,代表指针变量p将来肯定是指向函数
- // 左边的void:指针变量p指向的函数没有返回值
- // 右边的():指针变量p指向的函数没有形参
- void (*p)();
- // 指针变量p指向了test函数
- p = test;
- (*p)(); // 利用指针变量取出函数再调用
- p(); //简化写法
- test(); // 直接调用函数
1)数组元素的访问方式
int ages[5];int *p;p = ages;1> 数组名[下标] ages[i]2> 指针变量名[下标] p[i]3> *(p + i)
2)指针变量+1,地址值究竟加多少,取决于指针的类型
int * 4char * 1double * 8
使用指针遍历数组
- #include <stdio.h>
- int main()
- {
- int ages[5] = {10, 9, 8, 67, 56};
- intint *p;
- // 指针变量p指向了数组的首元素
- p = &ages[0];
- // 数组名就是数组的地址,也是数组首元素的地址
- //p = ages;
- /*
- p ---> &ages[0]
- p + 1 ---> &ages[1]
- p + 2 ---> &ages[2]
- p + i ---> &ages[i]
- */
- for (int i = 0; i<5; i++) {
- printf("ages[%d] = %d\n", i, *(p+i));
- }*/
------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------