目录
复习一下指针的概念
- 指针就是一个变量,用来存放地址,地址标识一块空间
内存会划分为小的内存单元,每个内存单元都有一个编号,这个编号就被称为地址,我们通常把存 有地址的“容器”称为指针
内存编号=地址=指针
指针或地址,要存储,就可以存放到指针变量中去 - 指针的大小是4/8个字节,当为32位系统时是4字节,64位系统为8字节
- 指针是有类型的,指针决定了指针±的步长,也就是说指针的类型决定了指针一次可以跳多少个字节
- 指针的运算
指针±整数:根据指针类型,移动指针
指针-指针:返回元素个数,整形指针-整形指针返回其中有多少个整形
指针的关系运算
1.字符指针
1.1修改字符指针指向元素的内容
我们先来看一下下面这个代码
int main()
{
char ch = 'w'; //创建一个char类型的变量去存放字符'w'
char *pc = &ch;//创建一个字符指针变量,去存放
*pc = 'a';//将字符'a'存放到pc地址所指向的字符,也就是把pc所指向的字符更改成字符'a'
return 0;
}
这个代码的意思是我们通过指针找到了此地址存放的变量,只需通过解引,拿到地址存放的变量后进行赋值操作我们就可以更改此地址处存放的数值。
1.2 指针指向字符串首元素
我们再来看一下指针存储字符串这种情况
int main()
{
char *p="abcdef";//将字符串首元素a的地址存放在指针变量p中
}
字符串的首元素是字符’a’,这里我们假设字符’a’的地址为0x001155f2,指针变量p指向字符串的时候,其实指向的是字符首元素的地址,也就是字符’a’的地址,这就不难理解指针变量p中存放的是0x001155f2
我们把指针p解引用看一下,你会发现输出的就是字符’a’,也就能看出来p这个指针变量中存放的就是字符串首元素地址
1.3使用字符指针去输出字符串
注意:
而打印字符串时,我们不需要解引用地址,给出首元素地址,%s可以顺着首元素去打印整个字符串
1.4更改常量字符串会发生什么
假如我们要更改这个字符串
你会发现运行结果是错误的,因为字符串"abcdef"是一个常量字符串,一旦更改会发生错误,计算机不允许去更改常量字符串,常量字符串会存放在只能进行‘读’操作的常量区,所以无法更改
1.5常量字符串和字符数组在内存中有什么不同
我们来看一下下面这个面试题
#include <stdio.h>
int main()
{
char str1[] = "hello bit.";
char str2[] = "hello bit.";
const char *str3 = "hello bit.";
const char *str4 = "hello bit.";
if(str1 ==str2)
printf("str1 and str2 are same\n");
else
printf("str1 and str2 are not same\n");
if(str3 ==str4)
printf("str3 and str4 are same\n");
else
printf("str3 and str4 are not same\n");
return 0;
}
这里的答案是:
你可能会觉得很诧异,str3和str4竟然是同一个字符串,确实是这样的
当你创建了两个相同的常量字符串时,因为是相同的常量字符串,编译器只会在常量区创建一个字符串,所以当你查询他们地址时,会发现他们是同一个地址
由于str1和str2是放在栈区,所创建的是两个不同的数组,所以 取出的地址也不相同
2.指针数组
2.1指针数组是什么
我们用类比来看一下什么是指针数组
整形数组:存放整形的数组
int arr[10]
字符数组:存放字符的数组
char arr[10]
所以我们可以推出指针数组就是:存放指针的数组,也就是说数组的每个元素都是指针
这里之所以是int*arr[3]其中3是数组中存放的元素个数,也就是说,指针数组中存放了3个指针
遍历方法: