全面学习C语言【四】:指针(指针变量、指针运算符、指针数组、指针运算)、malloc动态内存分配

本文详细介绍了C语言中的指针,包括取地址符的使用、指针变量的概念和特点、指针作为参数传递、指针运算及注意事项。特别讨论了指针和数组的关系以及动态内存分配的`malloc`函数。通过示例解释了如何通过指针操作内存和交换变量值,强调了正确使用指针的重要性。
摘要由CSDN通过智能技术生成

十、指针

🎈使用&取地址

对于scanf 将输入的值传给一个变量 那么要加上&符号

scanf("%d",&i);

C语言的变量是放在内存中的 每个变量都有个地址 地址就是变量在内存中所存放的地方的位置
&符号 就能够获取到指定变量的地址 它是C语言中的取地址符

获取变量的地址 它的操作数必须是变量 而不能对没有地址的取地址

使用%p来输出地址:

int i=0;
printf("%p\n",&i);

地址的大小取决于编译器和系统是32位还是64位架构

相邻的变量的地址

同时定义的两个变量 它们在内存中的地址位置也是紧挨着的 是相邻的

int i1;
int i2;
printf("%p\n",&i1); // 0061FECC
printf("%p\n",&i2); // 0061FEC8

这是因为 在堆栈中 内存是自顶向下分配的 因此先定义的变量会在上面(即地址值更高)

数组的地址

数组的引用和数组的取地址是一样的 都是数组的地址
数组的地址使用的是数组中第一项(也就是下标为0)的地址
且数组中的每一项之间都是相邻的 紧贴着的

int i[10];
printf("%p\n",&i); // 0061FEA8
printf("%p\n",i); // 0061FEA8
printf("%p\n",&i[0]); // 0061FEA8
printf("%p\n",&i[1]); // 0061FEAC
printf("%p\n",&i[2]); // 0061FEB0

🎈指针变量

将取得的变量的地址传递给一个函数 那么可以通过该地址在那个函数内访问这个变量

【指针】 是一种变量的类型
指针类型的变量就是专门用于保存地址的变量

下面是一个简单的例子:
将int类型的变量 i 的地址交给了指针p
int*中的*代表这是一个指针 int表示该指针指向的是int

int i;
int* p=&i;

p里保存的是变量i的地址 那么 可以说是p指向i

🚩指针变量

星号*可以靠近类型 也可以靠近变量名
因此 并不是将星号加给了int这个类型 而是加给了距离星号最近的那个变量名

int* a,b; // 此时 a是指针类型 而b只是普通的int类型
int *a,b; // 此时 a是指针类型 而b只是普通的int类型

在C中并没有int*这个类型

🚩指针变量的特点

在普通的变量中 存放的是实际的值
而在指针变量中 不会存放实际的值 存放的是具有实际的值的变量的地址

🚩指针作为参数

在指针作为参数的时候 用void f(int *p);来定义
在调用的时候 要这么传入:

int i=123;
f(&i); // 传入的是int类型的变量的【引用】而不是原本的变量名或值
🚩访问指针地址上的变量

若要访问 也很简单 只需要使用星号即可

当然 星号若作为双目运算符 那么是乘的意思
作为单目运算符 用于访问指针的值所表示的地址上的变量

#include <stdio.h>

void f(int *p);

int main()
{
   
	int i=123;
	printf("%p\n",&i); // 0061FECC
	f(&i);
	
	return 0;
}

void f(int *p)
{
   
	printf("%p\n",p); // 0061FECC
	printf("%d",*p); // 123
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值