黑马程序员---C语言基础---指针

------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

时间: 2024-10-10 04:42:08

黑马程序员---C语言基础---指针的相关文章

黑马程序员——C语言基础---指针

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一. 指针变量的定义 1. 定义的格式 l 类名标识符  *指针变量名; l int *p; 2. 先定义后赋值 l 简单取值 int a = 10; int *p; p = &a; printf(“%d”, *p); l 简单改值 *p = 9; 3. 定义的同时赋值 int a = 10; int *p = &a; 4. 实现修改实参 5. 注意点 l int *p;   p = 1

黑马程序员-C语言基础:指针类型与指针和数组、字符串的关系

//指针变量就是用来存储地址的,只能存储地址 格式:  int  *p;  这个p为指针变量:指针变量占8个字节 类型是用来说明这个指针指向的类型: 比如上边的int代表这个指针变量会指向int类型的存储空间: int *p = &a;//这样一句可以写,此时的*只是一个标志,表示这个*只是表示p是个指针: *p = &a;//这样写就错了:此时*p表示取p指向的空间的值: 指针疑问:指针既然都占据8个字节,那么为什么要划分类型, 是因为当用*p指针取值或者赋值的时候,知道该取几个字节,比

黑马程序员-c语言基础:各种数据类型的输出占位符

c语言中的输出操作相对java来说是比较麻烦的,每种数据类型的输出都有各自的占位符: 下面是各种数据类型的输出占位符: short/int : %d int a = 1; printf("这个整数是:%d", a); long: %ld; (long 是int得修饰,不能算是一种单独的数据类型,只是比int多了四个字节的存储空间) long long: %lld char : %c float/double : %f  float默认是6位小数输出:可以在%f中控制:例如:%.2f:输

黑马程序员-C语言基础:数组和字符串

数组:数组的定义注意点 数组初始化正确写法: int args[5] = {1,23,32,4,5}; int args[5] = {12,23}; int args[5] = {[3]=23, [4]=13};//这种写法也可以,直接给其中角标为3和4的赋值 int args[] = {12,23,32};//中括号中没写数组大小,在大括号中一定要写具体数值 int args['A'] = {2,34,5}; 错误写法: int args[];//这样编译器不知道给你开辟多大的内存空间 int

黑马程序员_01_Java语言基础部分(数据类型与表达式、流程控制语句、数组与方法)

------- android培训.java培训.期待与您交流! ---------- Java语言主要由5中符号组成 标识符:数字.字母.美元符.下划线(注意不能数字开头) 关键字:goto和const保留了它们,但是Java没有使用. 运算符:注意运算符优先级(左结合和右结合要注意) 分隔符:注意+号可以分割字符串. 注释:三种注释. 数据类型与变量 常量: 整型 浮点型 字符:注意后面跟三个八进制(\ddd)和 四位unicode码(\u8bf7) (不区分大小写) 字符串 布尔型 变量:

黑马程序员---C语言基础---结构体

------iOS培训.Java培训.Android培训, iOS学习型技术博客,期待与您交流------ C语言基础---结构体 一.什么是结构体 介绍结构体之前,我想先简单介绍下数组.我想大家对数组都再熟悉不过了,顾名思义,数组就是将一些数据(元素)组合在一起,作为一个整体.使用数组需要注意的是这些元素必须是相同类型.而结构体和数组类似,也是将一些数据组合在一起作为一个整体,但是这些元素可以是不同类型.可以这么理解:结构体是更加灵活的数组,因为它允许元素是不同的类型. 实际生活中,如果我们要

黑马程序员——c语言基础语法(二)

指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值.未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机.指针变量的赋值只能赋予地址,决不能赋予任何其它数据,否则将引起错误.在C语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址. 两个有关的运算符: &:取地址运算符. *:指针运算符(或称“间接访问” 运算符). C语言中提供了地址运算符&来表示变量的地址.其一般形式为:&变量名: 如&a表示变量a的地址,&b表示

黑马程序员— C语言基础之内存剖析

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 在学习C语言基础知识时,老师对内存的分析很重视,几乎每个知识点都会帮我们分析内存存储情况,透过内存的分析也让我们对C语言有了更深的一些了解,C语言跟其他计算机语言相比,对内存的分析和要求更高,下面我们一起来了解和学习一下C语言的内存剖析,是我个人的在学习中的一些总结,如果问题或者不到位的地方也希望大家能够一起交流和指正. 第一讲  进制 进制是一种计数的方式,数值的表示形式,一般我们C语言主要

黑马程序员——C语言——基础语法

首先学的是C语言的基础语法,主要分为关键字.标示符.注释.数据.常量.变量. 一.关键字 1   关键字是指在C语言中系统默认的有特殊意义的字符 2   关键字全部是小写字母表示,总共32个关键字(主函数[main]中int .return),如下: auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned