浅谈C语言——难点重点区(1)

本文详细介绍了C语言中的指针概念,包括内存地址、指针变量的定义与使用,以及如何通过指针操作变量。通过实例讲解了指针在实际编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指针(1)

在C语言中,关于指针相信是大多数初学者过不去的噩梦,当然对于小编也是一样,那么我们将必定有所突破,加油!!!

大约需要15分钟进行阅读和理解。

本文章参考《C语言程序设计现代方法(第二版)》以及自己总结,不正确或者不适当的地方欢迎批评指正,主要以学习总结以及应用为主,在深入学习的同时也会及时更正不适合的地方。

指针式C语言最重要——也是最常被误解——的特性之一。
学习指针是C语言中最重要的一环,能否正确理解和使用指针是考察C语言程度的最重要一环。

基础理解

1、 大多数现代计算机都将内存分割为字节(byte),每个字节存储8位的信息。且每个字节都有唯一的地址,用来和内存的其他字节的区分。如果内存中有n个字节,那么可以把地址看作0~n-1的数。
在这里插入图片描述
2、 程序中的每个变量占有一个或多个字节内存,把第一个字节的地址称为是变量的地址,如图:
在这里插入图片描述
3、 介绍用到的几种符号:
(1)
“*”:表示该变量的指针变量(间接寻址运算符)
例:*p 表示p指向的对象,并不是p本身。
“&”:表示为变量的地址

例如

j = *&i

相当于j=i,可以想象为*是&的逆运算。

如:

p=&i;     // p指向的对象(i的值)
	q=&j;     //q指向的对象(j的值)
	*q=*p;    // p指向的对象(i的值)复制到q指向的对象(j的值)中
int *p;     /*定义指针变量p,指向整型数据,可以存放整型变量的地址*/

当定义完后,在接下来的运算时可以允许不带” *”

&x        /*表示x在内存中的地址*/
int *p = &a;     /*指针变量p指向整型变量a,即p的内容为a的地址*/

(个人理解:带*表示的是内容,&表示的是地址)

写一个简单的小程序,看一下他的结果到底是怎么运作的:

#include<stdio.h>

int main()
{
	int a,b;
	int *p,*q;
	p=&a;                        //p指向a ,p的内容为a的地址 
	q=&b;                       //q指向b ,q的内容为b的地址                 
	printf("输入1个整数:\n");
	scanf("%d",&b);
	*p=*q;                       //q指向的对象(b的值)复制到p指向的对象(a的值)中
	printf("a=%d\n",a);
	return 0;
 }

在这里插入图片描述

#include<stdio.h>

int main()
{
	int a,b;
	int *p,*q;
	p=&a;                        //p指向a ,p的内容为a的地址 ,这里的p也可以理解为*p,不可理解为变量p。
	q=&b;                        //q指向b ,q的内容为b的地址 ,这里的q也可以理解为*q,不可理解为变量q。
	printf("输入两个整数:\n");
	scanf("%d%d",&a,&b);
	printf("a=%d,b=%d\n",*p,*q);
	return 0;
 }

在这里插入图片描述

解析:&a,&b分别为3和4,并且分别赋值与p和q,输出发现在定义完成后p的值即为p,q的值即为q。

4、C语言基本数据类型和其所占字节数:
在这里插入图片描述

二、指针变量基础

先想一个问题,在一个程序中*p和p到底是什么关系呢?

比如写一个部分程序

int *p=&a;
scanf("%d",&a);
printf("%d\n",p);
printf("%d\n",*p);

试想输出分别是什么呢?

在之前可知这里的p表示的是p指向a的地址,即p的输出就是a的地址,而*p就是指的是地址a所表示的这个地址的存储的数据。

接下来演示一下:

#include<stdio.h>

int main()
{
	int a;
	int *p=&a;
	
	printf("输入一个整数:\n");
	scanf("%d",&a);
	printf("a的地址:%d\n",p);
	printf("*p的地址:%d\n",*p);
	p++;
	printf("P++后的地址:%d\n",p);
	
	return 0;
 } 

在这里插入图片描述

你会很精巧的发现:printf("a的地址:%d\n",p);这一步执行的结果是一个a的地址,printf("*p的地址:%d\n",*p);则表示的a的地址处int *p=&a;存储的结果被拿出来给*pp++;执行之后,真正执行的是地址a的地址自增1即增加4位(int型所占内存单元为4字节)往后推移即为p++后的结果。

好了,今天的文章可能比较苦涩或者难懂,关于指针几乎会用上之前所学的大部分知识,可能会有时候学不下去,这时候一定要安静下来,拿出草稿纸一遍一遍分析运算,或者可以用编程环境进行一遍一遍实验,相信这样一定会学会的,大家一块加油,这时候别看着好难,一定不要这样想,难题一定被解决的加油!!!

小编一边深入学习,一边继续更新新的文章,然后发现问题会第一时间更正,有需要修正的地方请告知小编,第一时间做出修改。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值