C指针学习总结

本文详细介绍了C语言中的指针,包括指针定义、指针变量、指针作为函数参数、数组元素的指针、指针引用字符串、指向函数的指针、返回指针的函数、指针数组和多重指针,以及动态内存分配。文中通过实例分析了指针的使用方法,如如何定义、赋值、传递和修改,同时讨论了数组、字符串、函数和动态内存与指针的关系。
摘要由CSDN通过智能技术生成

1.指针

在内存中通过地址访问变量单位,将地址形象化地称为指针
通过变量名对变量进行访问称为“直接访问”。
通过指针存储变量地址,通过指针访问变量称为“间接访问”。

  • 简而言之:一个变量的地址称为该变量的"指针"
    如果有一个变量专门存放另一个变量的地址(指针),则该变量为“指针变量

2.指针变量

2.1如何定义指针变量?

定义指针变量的一般形式为:
类型名 *指针变量名
类型名是定义指针变量必须指定的“基类型”。对于每一个类型,内存中所占字节不同,如一般编译器int型为4字节,指针访问下一个变量时,就需要在该地址的基础上加上4个字节。变量名前的*代表该变量为指针变量。
一个变量的指针包含两个方面的信息,存储单元编号表示的地址,如内存中编号为m的字节。另一个是存储单元的数据类型
指针变量只能存放地址,将一个整数赋值给一个指针变量不合法。
例1

#include<stdio.h>
int main()		
{
   
	int a=100;
	int *p=&a;
	printf("%d %d %o",a,*p,p);//输出a的值,以八进制输出p指向的地址
	return 0
}

指针变量p指向整形变量a的地址,通过*访问变量a的值

2.2如何引用指针变量

1.给指针变量赋值p=&a;
2.引用指针变量指向的变量,如果指针已被赋值,*p则是a的值,也可以重新赋值,如*p=3,修改a的值
3.引用指针变量的值,通过printf输出p的值(地址)
4.例2通过交换指针变量指向实现交换变量a,b的值。
例2

#include<stdio.h>
int main()  
{
   
	int a=2,b=3;
	int *p1=&a,*p2=&b;
	printf("before swap\n a=%d b=%d\n",*p1,*p2);
	int *temp;
	temp=p1;
	p1=p2;
	p2=temp;
	printf("after swap\n a=%d b=%d",*p1,*p2);
	return 0;
}

2.3指针变量作为函数参数

通过修改指针指向变量的值
例3

#include<stdio.h>
void swap(int *p1,int *p2)
{
   
	int temp;
	temp=*p1;
	*p1=*p2;
	*p2=temp;
}

int main()  
{
   
	int a=2,b=3;
	int *p1=&a,*p2=&b;
	printf("before swap\n a=%d b=%d\n",*p1,*p2);
	swap(p1,p2);
	printf("after swap\n a=%d b=%d",*p1,*p2);
	return 0;
}

运行结果:方法1
分析:通过值传递将p1,p2传入函数中,互换*p1和*p2的值,从而达到交换a,b的值

能否通过函数调用直接修改指针变量的指向(值)?

例4

#include<stdio.h>
void swap(int *p1,int *p2)
{
   
	int *temp;
	temp=p1;
	p1=p2;
	p2=temp;
}
int main()   
{
   
	int a=2,b=3;
	int *p1=&a,*p2=&b;
	printf("before swap a=%d b=%d\n",*p1,*p2);
	swap(p1,p2);
	printf("after swap a=%d b=%d",*p1,*p2);
	return 0;
}

结果:
在这里插入图片描述
分析:显而易见,不能,为什么?
这就要引入一个知识点:

值传递方式

实参向形参的数据传递是“值传递”,单向传递,只能由实参传给形参,不能由形参传给实参。实参和形参在内存中占有不同的存储单元,实参无法得到形参的值

这样就可以解释这个问题了。
不能企图修改指针形参的值而使指针实参的改变,C语言中实参变量和形参变量之间的数据传递时单向的“值传递”。用指针变量作函数参数时同样要遵循这一规则。即不能通过执行调用函数来改变实参指针变量的值,但可以改变指针变量所指的变量的值。

3.数组元素的指针

3.1一维数组:

上文所说,指针即对象的地址,那么数组的指针就是数组的地址。如果将数组的首元素地址赋值给指针变量,那么引用数组元素可以下标法也可以用指针法,指针法能使目标程序质量高(占内存少ÿ

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值