Week8 指针与字符串

一.指针

1.有关的运算符

运算符sizeof

  • 是一个运算符,给出某个类型或变量在内存中所占据的字节数
  • sizeof(int) //int占据几个字节
  • size(i) // i这个变量占据几个字节

运算符&

  • scanf("%d",&i)里的&
  • 获得变量的地址,它的操作数必须是变量
    -int i;printf("%x",&i);

示例
Week8 指针与字符串_第1张图片
输出结果:
在这里插入图片描述
%p 按16进制输出数据

&不能取的地址

  • &不能对没有地址的东西取地址
    -&(a+b)?
    -&(a++)?
    -&(++a)?
    以上都不行 必须是明确的变量

  • 变量的地址

  • 相邻变量的地址

  • &的结果的sizeof

  • 数组的地址

  • 数组单元的地址

  • 相邻的数组单元的地址

Week8 指针与字符串_第2张图片
Week8 指针与字符串_第3张图片

2.函数scanf

  • 如果能够以将取得的变量的地址传递给一个函数,能否通过这个地址在那个函数内访问这个变量?
  • scanf(“%d”,&i);
  • scanf()的原型应该是怎样的?我们需要一个参数能保存别的变量的地址,如何表达能够保存地址的变量?
  • 什么样的类型能接受取地址得到的那个地址呢?

3.指针的含义

  • 就是保存地址的变量
    int i;
    int* p=&i;
    Week8 指针与字符串_第4张图片

int* p,q; //*p是int 所以
int *p,q;
上面两个式子意思一样
*p是一个int p就是一个指针了
星 可以靠近int 也可以靠近p 都代表p是一个指针 指向int q只是一个普通的int变量,并不是将 星 加给了int
要想表达p q都是指针
int *p,*q;

4.指针变量

  • 变量的值是内存的地址
    -普通变量的值是实际的值
    -指针变量的值是具有实际值的变量的地址
    Week8 指针与字符串_第5张图片

5.作为参数的指针

  • void f(int *p);
  • 在被调用的时候得到了某个变量的地址;
  • int i=0;f(&i);
  • 在函数里面可以通过这个指针访问外面的这个i

Week8 指针与字符串_第6张图片

6.访问那个地址上的变量

  • 星号*是一个单目运算符,用来访问指针的值所表示的地址上的变量
  • 可以做右值也可以做左值
  • int k=*p;
  • *p=k+1;

Week8 指针与字符串_第7张图片

7.指针与数组

1.传入函数的数组变成了什么?

Week8 指针与字符串_第8张图片

  • 函数参数表中的数组实际上是指针
  • sizeof(a)==sizeof(int*)
  • 但是可以用数组的运算符[]进行运算
    Week8 指针与字符串_第9张图片

2.数组变量是特殊的指针

  • 数组变量本身表达地址,所以
    • int a[10];int *p=a; //无需用&取地址
  • 但是数组的单元表达的是变量,需要用&取地址
    • a==&a[0]
  • 【】运算符可以对数组做,也可以对指针做
    • p【0】==a【0】
  • *运算符可以对指针做,也可以对数组做;
    • *a=25;
  • 数组变量是const的指针,所以不能被赋值
    • int a[a]《==》int *const a=

Week8 指针与字符串_第10张图片

二.字符串

1.字符类型

  • char是一种整数,也是一种特殊的类型:字符。这是因为:
  • 用单引号表示的字符字面量:’a‘,‘1’
  • ‘’也是一个字符
  • printf和scanf里用%o来输入输出字符

2.字符的输入输出

Week8 指针与字符串_第11张图片

字符计算

Week8 指针与字符串_第12张图片

大小写转换

  • 字母在ASCII表中是顺序排列的
  • 大写字母和小写字母是分开排列的,并不是在一起
    Week8 指针与字符串_第13张图片

3.逃逸字符

用来表达无法印出来的控制字符或者特殊字符,它有一个反斜杠”\“开头,后面跟上另外一个字符,这两个字符合起来,组成了一个字符
在这里插入图片描述
Week8 指针与字符串_第14张图片

4.字符串的定义

  • 以0(整数0)结尾的一串字符
  • 0或”\0“是一样的,但是和”0“不同
  • 0标志字符串的结束,但它不是字符串的一部分
  • 计算字符串长度的时候不包括这个0
  • 字符串以数组的形式出现,以数组或者指针的形式访问
  • 更多的是以指针的形式
  • string.h里有很多处理字符串的函数

5.字符数组 字符串

Week8 指针与字符串_第15张图片Week8 指针与字符串_第16张图片

6.字符串变量

Week8 指针与字符串_第17张图片
或者叫字面量

  • ”Hello“

  • ”Hello“会被编译器变成一个字符数组放在某处,这个数组的长度是6,结尾还有表示结束的0(!!注 一定要有这个0才是字符数组)

  • C语言的字符串是以字符数组的形态存在的

  • 不能用运算符对字符串做运算

  • 通过数组的方式可以遍历字符串

  • 唯一特殊的地方是字符串字面量可以用来初始化字符数组

7.字符串常量

cgar* s=”Hello,world!“;
Week8 指针与字符串_第18张图片

指针还是数组?

Week8 指针与字符串_第19张图片
Week8 指针与字符串_第20张图片

char*是字符串?

  • 字符串可以表达为char*的形式
  • char*不一定是字符串
  • 本意是指向字符的指针,可能指向的是字符的数组(就像int*一样)
  • 只有它所指的字符数组有结尾的0,才能说它所指的字符串

8.字符串的计算

字符串输入输出

Week8 指针与字符串_第21张图片

安全的输入

  • char string[8];
  • scanf("%7s",string);
  • 在%和s之间的数字表示最多允许读入的字符的数量,这个数字应该比数组的大小小1
  • 下一次scanf从哪里开始?

常见错误——指针未初始化

Week8 指针与字符串_第22张图片

空字符串

Week8 指针与字符串_第23张图片

8.字符串函数

Week8 指针与字符串_第24张图片
Week8 指针与字符串_第25张图片
Week8 指针与字符串_第26张图片
Week8 指针与字符串_第27张图片
Week8 指针与字符串_第28张图片
Week8 指针与字符串_第29张图片
安全版本不会越界 多了掐掉

Week8 指针与字符串_第30张图片

你可能感兴趣的:(Week8 指针与字符串)