黑马程序员-06.C字符串和指针

来源:互联网 发布:淘宝收藏代码在线生成 编辑:程序博客网 时间:2024/06/03 16:46

                 ------   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

2.指针

1)指针的定义格式
变量类型 * 变量名;

 int *p;

指针变量p前面的int:指针变量p只能指向int类型的数据

2)指针变量只能存储地址

3)指针就一个作用:能够根据一个地址值,访问对应的存储空间

4)指针变量p指向了变量a


5)定义变量时的*仅仅是一个象征,没有其他特殊含义
6)任何指针都占用8个字节的存储空间
7)指针的使用注意
1>不建议的写法, int *p只能指向int类型的数据

2>指针变量只能存储地址

int *p;

p = 200;

3>指针变量未经过初始化,不要拿来间接访问其他存储空间

int *p;

printf("%d\n", *p);

4>不正确的写法

int a;

a = 10;

*p = &a;不正确的写法

 p = &a;

5)指向指针的指针

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 * 4
char * 1
double * 8
使用指针遍历数组
[objc] view plaincopy
  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.     int ages[5] = {10986756};  
  6.       
  7.     intint *p;  
  8.     // 指针变量p指向了数组的首元素  
  9.     p = &ages[0];  
  10.     // 数组名就是数组的地址,也是数组首元素的地址  
  11.     //p = ages;  
  12.       
  13.     /* 
  14.      p ---> &ages[0] 
  15.      p + 1 ---> &ages[1] 
  16.      p + 2 ---> &ages[2] 
  17.      p + i ---> &ages[i] 
  18.      */  
  19.   
  20.      for (int i = 0; i<5; i++) {  
  21.      printf("ages[%d] = %d\n", i, *(p+i));  
  22.      }*/  
1)数组元素的访问方式
int ages[5];
int *p;
p = ages;
1> 数组名[下标] ages[i]
2> 指针变量名[下标] p[i]
3> *(p + i)
2)指针变量+1,地址值究竟加多少,取决于指针的类型
int * 4
char * 1
double * 8
使用指针遍历数组
[objc] view plaincopy
  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.     int ages[5] = {10986756};  
  6.       
  7.     intint *p;  
  8.     // 指针变量p指向了数组的首元素  
  9.     p = &ages[0];  
  10.     // 数组名就是数组的地址,也是数组首元素的地址  
  11.     //p = ages;  
  12.       
  13.     /* 
  14.      p ---> &ages[0] 
  15.      p + 1 ---> &ages[1] 
  16.      p + 2 ---> &ages[2] 
  17.      p + i ---> &ages[i] 
  18.      */  
  19.   
  20.      for (int i = 0; i<5; i++) {  
  21.      printf("ages[%d] = %d\n", i, *(p+i));  
  22.      }*/  

4.指针与字符串

1)数组元素的访问方式
int ages[5];
int *p;
p = ages;
1> 数组名[下标] ages[i]
2> 指针变量名[下标] p[i]
3> *(p + i)
2)指针变量+1,地址值究竟加多少,取决于指针的类型
int * 4
char * 1
double * 8
使用指针遍历数组
[objc] view plaincopy
  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.     int ages[5] = {10986756};  
  6.       
  7.     intint *p;  
  8.     // 指针变量p指向了数组的首元素  
  9.     p = &ages[0];  
  10.     // 数组名就是数组的地址,也是数组首元素的地址  
  11.     //p = ages;  
  12.       
  13.     /* 
  14.      p ---> &ages[0] 
  15.      p + 1 ---> &ages[1] 
  16.      p + 2 ---> &ages[2] 
  17.      p + i ---> &ages[i] 
  18.      */  
  19.   
  20.      for (int i = 0; i<5; i++) {  
  21.      printf("ages[%d] = %d\n", i, *(p+i));  
  22.      }*/  

定义字符串的2种方式
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);
[objc] view plaincopy
  1. #include <stdio.h>  
  2.   
  3. void test()  
  4. {  
  5.     printf("调用了test函数\n");  
  6. }  
  7.   
  8. int main()  
  9. {  
  10.     // (*p)是固定写法,代表指针变量p将来肯定是指向函数  
  11.     // 左边的void:指针变量p指向的函数没有返回值  
  12.     // 右边的():指针变量p指向的函数没有形参  
  13.     void (*p)();  
  14.       
  15.     // 指针变量p指向了test函数  
  16.     p = test;  
  17.       
  18.     (*p)(); // 利用指针变量取出函数再调用  
  19.     p();    //简化写法  
  20.       
  21.     test(); // 直接调用函数  
  22.   
  23.    





1)数组元素的访问方式
int ages[5];
int *p;
p = ages;
1> 数组名[下标] ages[i]
2> 指针变量名[下标] p[i]
3> *(p + i)
2)指针变量+1,地址值究竟加多少,取决于指针的类型
int * 4
char * 1
double * 8
使用指针遍历数组
[objc] view plaincopy
  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.     int ages[5] = {10986756};  
  6.       
  7.     intint *p;  
  8.     // 指针变量p指向了数组的首元素  
  9.     p = &ages[0];  
  10.     // 数组名就是数组的地址,也是数组首元素的地址  
  11.     //p = ages;  
  12.       
  13.     /* 
  14.      p ---> &ages[0] 
  15.      p + 1 ---> &ages[1] 
  16.      p + 2 ---> &ages[2] 
  17.      p + i ---> &ages[i] 
  18.      */  
  19.   
  20.      for (int i = 0; i<5; i++) {  
  21.      printf("ages[%d] = %d\n", i, *(p+i));  
  22.      }*/  




 ------   Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------











0 0
原创粉丝点击