8 指针与字符串

来源:互联网 发布:java包名命名规范 编辑:程序博客网 时间:2024/06/05 18:52

8 指针与字符串


  • sizeof运算符:给出某个类型或变量在内存中占据的字节数,int占4字节,32位;double占8字节,64位
  • 运算符&:获取变量的地址,%p可以输出地址;32位架构下,地址4字节,64位架构下,地址8字节。——地址的大小是否与int相同取决于编译器。
  • &不能对没有地址的东西取地址,分配在内存的堆栈,自顶向下分配
  • 对于一个数组:&a、a、&a[0]相同,&a[1]在它们之后
  • scanf:将取得的变量的地址传递,在这个地址用scanf函数访问这个变量

  • 指针:保存地址的变量
  • int *p,q:p是指针,q是int
  • int* p,q:p是指针,q是int
  • 指针变量的值是具有实际值的变量的地址
  • *是一个单目运算符,用来访问指针的值所表示的地址上的变量,可以做左值也可以做右值。int k = *p; *p = k+1
  • void minmax(int a[]):其中a[]是一个指针,可以当做数组用——函数参数表中的数组实际上是指针,sizeof(a) = sizeof(int *)
  • 数组变量是特殊的指针,[]运算符可以对数组做,也可以对指针做;*运算符可以对指针做,也可以对数组做。
  • 数组变量是const的指针,不能被赋值:int a[] 等价于 int * const a = ……

  • 字符数组 char word[]={‘H’,’e’,’l’,’l’,’o’,’!’};——不是c语言的字符串,因为不能用字符串的方式做计算。
  • 字符串 char word[]={‘H’,’e’,’l’,’l’,’o’,’!’,’\0’};——依然还是字符数组。
  • 字符串:以0结尾的一串字符,0和’\0’相同,但和’0’不同。0标志字符串的结束,但不是字符串的一部分,例如计算长度时不包含这个0。字符串以数组的形式存在,以数组或指针的形式访问。string.h有很多处理字符串的函数。

  • char *str = “hello”;
    char word[] = “hello”;
    char line[10] = “hello”;长度为6,编译器会在末尾加0

  • 两个相邻的字符串会被自动合并成一部分
  • 字符串以字符数组的形态存在,通过数组的方式可以遍历字符串。字符串常量可以用来初始化字符数组。

  • char *s = “hello,world!”; ,指向的字符串位于程序的代码段,只读,无法更改。相当于const

  • 如果要修改,应该这样定义:char s[] = “hello,world!”;
  • 数组:这个字符串在这里,作为本地变量空间自动被回收;
    指针:这个字符串不知道在哪里,用于处理参数,动态分配空间
  • 字符串可以表达为char*,但char*不一定是字符串,它的本意是指向字符的指针,可能指向的是字符的数组,只有在它指向的字符数组结尾有0才是字符串
  • scanf读入到空格、Tab或回车为止,读入字符串不需要&
  • scanf可以指定读入几个字符,%7s:最多读7个字符
  • char buffer[100]=”“;这是一个空的字符串,buffer[0]=’\0’
    char buffer[]=”“;这个数组的长度只有1

字符串函数

  • strlen(const char *s):返回字符串长度,不包括最后的’\0’
  • strcmp:比较两个字符串,返回0、>0、<0。数组的比较一定是不同(因为地址不同)
  • strcpy:把第二个字符串拷贝到第一个变量的空间
  • strcat:把第二个字符串连接到第一个后面(第一个必须有足够的空间),第一个字符串的’\0’被覆盖
  • strcpy和strcat都不安全,因为无法知道是否有足够的空间!
  • 安全版本:char *strncpy(char *restrict dst, const char *restrict src, size_t n):最多拷贝n、char *strncat(char *restrict s1, const char *restrict s2, size_t n)
  • strchr:找字符,返回指针
  • strrchr:从右边开始找
0 0