指针(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;
)存储的结果被拿出来给*p
,当p++;
执行之后,真正执行的是地址a的地址自增1即增加4位(int型所占内存单元为4字节)往后推移即为p++
后的结果。
好了,今天的文章可能比较苦涩或者难懂,关于指针几乎会用上之前所学的大部分知识,可能会有时候学不下去,这时候一定要安静下来,拿出草稿纸一遍一遍分析运算,或者可以用编程环境进行一遍一遍实验,相信这样一定会学会的,大家一块加油,这时候别看着好难,一定不要这样想,难题一定被解决的,加油!!!
小编一边深入学习,一边继续更新新的文章,然后发现问题会第一时间更正,有需要修正的地方请告知小编,第一时间做出修改。