------iOS培训、Java培训、Android培训, iOS学习型技术博客,期待与您交流------
C语言基础---指针
学习C语言,指针是必须重视的,本人觉得,正是因为指针才使得C语言如此的强大与妙不可言(当然还有其丰富的数据类型与运算符)。
指针的作用,说的大白话一点就是:有了指针,就能找到你。
就好比全球定位系统,只要你在地球上,把精确的地址给我,我就能定位到你。
那么什么是指针变量呢?就是存放地址值的变量,该变量只能存放内存地址值,定义如下:
类型标识符 *指针变量名;
先看如下代码:
int a=88888;
int *p;
p=&a;
printf("a的内容为:\n,*p");
我先模拟个场景来解释上面的代码:假设a是一堆宝藏,藏在ffc0(变量a的内存地址)这个位置,你现在要去寻宝,手上有张藏宝图p,清楚的告诉了你宝藏a的藏身之处是ffc0,那样你就可以轻而易举的找到宝藏a了。就那么简单,说白了,指针p就像这张藏宝图,上面清晰记录着宝藏a的地址。
内存图剖析如下:
上述代码的解释:
int a=88888; //定义整形变量a,此时系统分配内存给变量a,并赋值88888
int *p; //定义指针变量p
p=&a; //将变量a的地址存放到指针变量p中
printf("a的内容为:\n,*p"); //输出*p的内容,即a的值
注:
int *p;
printf("a的内容为:\n,*p");
两个*代表不同的含义:
int *p; 这行代码中的“*”只是一个说明符,用来说明p不是其他变量,而是指针变量,将来只能把地址赋值给p,相当于是一个象征含义,不能省略,但也不属于变量名的一部分。而“*”前面的类型标识符(int)表示只能将该类型(int)的变量地址赋值给定义的指针变量p
printf("a的内容为:\n,*p");这行代码中的“*”不是说明符,而是指针运算符,其作用是:通过存放在指针变量p的地址找到该地址下的变量,在上述代码中,相当于a
指针的初始化:
1>先定义后初始化
int a=3; //定义整形变量a,初始值为3
int *p; //定义指针变量p,将来存放int类型变量的地址
p=&a; //将int类型的变量a的地址赋值给指针变量p,则可以说,指针变量p指向变量a
2>定义的同时初始化
int a=3; //定义整形变量a,初始值为3
int *p=&a; //定义指针变量p,将int类型的变量a的地址赋值给指针变量p,则可以说,指针变量p指向变量a
注:在指针变量没有指向确定地址之前,不要对它所指的内容赋值。下面的写法是错误的
int *p;
*p=5;
试想一下,上面代码只是定义了一个指针变量p,并没有存放明确的地址,意味着p可能指向任何不受程序控制的内存,然后往该不可知的内存赋值一个数据,想想都恐怖啊。
默认情况下,一个函数只能有一个返回值,利用指针可以模拟实现“无数个返回值”,相当于无数个返回值。
例:写一个函数,同时计算两个整数的和、差、积、商、模
#include <stdio.h>
// 计算两个数的和、差、积、商、模
void heChaJiShangMo(int num1, int num2, int *he, int *cha, int * ji, int *shang, int *yu)
{
*he = num1 + num2;
*cha = num1 - num2;
*ji = num1 * num2;
*shang = num1 / num2;
*yu = num1 % num2;
}
int main(int argc, const char * argv[])
{
int num1 = 15, num2 = 3;
int he, cha, ji, shang, mo;
// 通过地址传递,在自定义的函数内部修改外部的值,间接达到一个函数多个返回值
heChaJiShangMo(num1, num2, &he, &cha, &ji, &shang, &mo);
printf("%d与%d的\n",num1, num2);
printf("和==%d,\n差==%d,\n积==%d,\n商==%d,\n模==%d\n",he, cha, ji, shang, mo);
return 0;
}
初略了解了下指针,可能有些人会问:指针变量在内存中占多少字节的存储空间呢?既然指针变量可以指向各种不同类型的数据,其占用的空间会不会有所不同?
其实搞清楚指针的本质,就不会有这个疑问了。指针变量存放的是一个地址,内存中所有的地址肯定是一样的格式,因此,不管是指向什么类型变量的指针,其本质还是存放一个地址,既然都是一个地址,那么大家肯定都一样大,因此在同一种编译环境下,一个指针变量占用的内存空间是固定的,并不会因所指向变量的类型而不同。
16位编译器 32位编译器 64位编译器
指针变量占的字节数 2 4 8