C语言【指针】(1)

1. 内存和地址

我们知道计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,电脑上内存是8GB/16GB/32GB 等,那这些内存空间如何⾼效的管理呢?
其实也是把内存划分为⼀个个的内存单元,每个内存单元的大小取1个字节。
计算机中常见的单位(补充):⼀个比特位可以存储⼀个2进制的位1或者0。
在计算机中我们把内存单元的编号也称为地址。C语⾔中给地址起了新的名字叫:指针
内存单元的编号 == 地址 == 指针

2. 指针变量和地址

2.1 取地址操作符(&)

C语⾔中创建变量其实就是向内存申请空间。

#include<stdio.h>
int main()
{
    
    
	int a = 0;
	int* p = &a;
	return 0;
}

此时p就叫做指针变量。

2.2 指针变量和解引⽤操作符(*)

#include<stdio.h>
int main()
{
    
    
	int a = 100;
	int* pa = &a;
	*pa = 0;
	return 0;
}

上⾯代码中第7⾏就使⽤了解引⽤操作符, *pa 的意思就是通过pa中存放的地址,找到指向的空间,pa其实就是a变量了;所以pa = 0,这个操作符是把a改成了0。

3. assert断言

assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报错终⽌运⾏。这个宏常常被称为“断⾔”。

4. const修饰指针

⼀般来讲const修饰指针变量,可以放在的左边,也可以放在的右边,意义是不⼀样的。
• const如果放在的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。但是指针变量本⾝的内容可变。
• const如果放在
的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。

5.指针的使用和传址调用

在传值调用中

#include <stdio.h>
void Swap1(int x, int y)
{
    
    
 int tmp = x;
 x = y;
 y = tmp;
}
int main()
{
    
    
 int a = 0;
 int b = 0;
 scanf("%d %d", &a, &b);
 printf("交换前:a=%d b=%d\n", a, b);
 Swap1(a, b);
 printf("交换后:a=%d b=%d\n", a, b);
 return 0;
}

结论:
实参传递给形参的时候,形参会单独创建⼀份临时空间来接收实参,对形参的修改不影响实参。

而在传址调用中就可实现互换

#include <stdio.h>
void Swap2(int*px, int*py)
{
    
    
 int tmp = 0;
 tmp = *px;
 *px = *py;
 *py = tmp;
}
int main()
{
    
    
 int a = 0;
 int b = 0;
 scanf("%d %d", &a, &b);
 printf("交换前:a=%d b=%d\n", a, b);
 Swap2(&a, &b);
 printf("交换后:a=%d b=%d\n", a, b);
 return 0;
}