指针这块必须牢牢把握!(初阶-上)

这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战


最近,想复习一下C语言,所以笔者将会在掘金每天更新一篇关于C语言的文章! 各位初学C语言的大一新生,以及想要复习C语言/C++知识的不要错过哦! 夯实基础,慢下来就是快!

指针是什么

在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。


内存
image.png


指针

指针是个变量,存放内存单元的地址(编号)。


1
2
3
4
5
6
7
8
arduino复制代码#include <stdio.h>
int main()
{
int a=10;//在内存中开辟一块空间
//这里我们对变量a,取出它的地址,可以使用&操作符。将a的地址存放在p变量中,p就 是一个之指针变量。
int*p= &a;
return 0;
}

总结:

  • 指针就是变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。
  • 在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。
  • 在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。

指针是用来存放地址的,地址是唯一标示一块地址空间的。

指针的大小在32位平台是4个字节,在64位平台是8个字节


寄存器

寄存器集成到CPU上


种类:

1
2
3
4
5
6
c复制代码eax
ebx
ecx
edx
ebp
esp

4.指针类型的意义

一.指针类型决定了指针解引用操作的时候,一次访问几个字节

(访问内存的大小)

image.png

1
2
3
4
5
6
7
8
c复制代码int main()
{
int a = 0x00001111;
char* pc = (char*)&a;
int* pi = &a;
printf("%d %d", *(pc), *(pi));// 17 4369
return 0;
}

二.指针类型决定了指针+-整数的步长(指针+-整数跳过几个字节)

1
2
3
4
5
6
7
8
c复制代码int main()
{
char arr[] = { 1,2,3,4,5,6 };
int* pi = (int*)arr;
char* pc = arr;
printf("%p %p\n", pi , pc );
printf("%p %p\n", pi+1,pc+1);
}

![image-20211116172610486](E:\Believe everything maybe true\Bit\C\初阶指针\初阶指针.assets\image-20211116172610486.png)

image.png
整形指针+1:跳过4个字节

字符指针+1:跳过1个字节

指针+1跳过的字节数取决于指针指向的变量的类型


三.指针-指针得到的数字的绝对值是指针和指针之间元素的个数

例如:

1
2
3
4
5
6
c复制代码int main()
{
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
printf("%d\n", &arr[9] - &arr[0]);//9
printf("%d\n", &arr[0] - &arr[9]);//-9
}

指针-指针的前提是两个指针指向的是同一块区域

如:&arr[9] - &ch[0] err

image.png

利用指针-指针求字符串长度(模拟strlen)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
c复制代码//法1:计数器
size_t my_strlen(const char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
//方法2:递归
size_t my_strlen2(const char* str)
{
//如果str指向的不是\0,就加本身为1,然后递归下一个字符
if (*str != '\0')
return 1 + my_strlen(str + 1);
//当指向的是\0就返回0
else
return 0;
}
//方法3:指针-指针
size_t my_strlen3(const char* str)
{
char* start = str; //记录起始位置
char* end = str;
//遍历字符串找到\0位置
while (*end != '\0')
{
end++;
}
// \0位置-起始位置==>长度
return end - start;
}
int main()
{
char* str = "Struggling";
size_t ret = my_strlen1(str);
printf("%s的长度为%d\n", str, ret);
return 0;
}

指针-指针的标准规则

1
c复制代码允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较

image.png
p3:指向数组第一个元素前面的位置

p2:指向数组最后一个元素后面的位置

p1:指向数组元素的指针


今天就先到这吧~感谢你能看到这里!希望对你有所帮助!欢迎老铁们点个关注订阅这个专题! 同时欢迎大佬们批评指正!

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%