06指针

一丶认识指针/为什么要学习指针

[需求]编写自定义函数func,将main函数中的两个整形变量的值交换

void func(int a,int b)
{
    //交换传进来的a,b的值
    int temp=a;
    a=b;
    b=temp;
}
int main(int argc, const char * argv[])
{
    int a=10,b=20;
    func(a,b);
    printf("%d %d\n",a,b);//10 20
    return 0;
}

​ [注]指针是为了帮助我们实现跨内存访问

二丶指针的定义

类型符*指针变量名;

​ 例子:int *i;

[注]指针变量中存的是地址

三丶指针的初始化

​ [注]刚定义出来的指针变量,如果不进行初始化,指针变量的值是不确定的,我们称这样的指针为“野指针”

int a;
int *i = &a;//这里是定义一个指针变量i,同时给i赋值为&a
            //一旦指针变量i中存有一个地址,i就指向了a
           //一旦指针变量i指向了普通变量a,就可以通过i来访问a中的数据
*i      //取出i指向的a中的数据
*i = 20 //改变i指向的a中的数据

四丶指针的赋值

int a,b;
int *ppi = &a;    //ppi指向了a
ppi = &b;          //ppi指向了b

​ [注]指针变量的赋值,是为了改变指针变量的指向

​ [注]通过对指针变量取*,可以访问指针变量所指向的内存单元的数据,所访问数据的内存单元大小是由指针本身的类型决定的

五丶指针变量所占内存大小

int *p1;
char *p2;
double *p3;
printf("%ld\n",sizeof(p1));//8
printf("%ld\n",sizeof(p2));//8
printf("%ld\n",sizeof(p3));//8
//在64位系统下,不同类型的指针变量占8字节内存
//在32位系统下,不同类型的指针变量占4字节内存

六丶指针和函数——指针变量要作为函数的参数

[指针作为函数参数]如果需要在一个函数中访问另一个函数中的数据,这是就需要使用指针(传入数据的地址,用一个指针变量接收)

void foo(int *a)//a=&b
{
    printf("%d\n",*a);
    *a=20;
}

void main(void)
{
    int b;
    foo(&b);
} 

七丶指针和数组

1.指针加1

​ [注] 指针变量加1,实际是加了指针变量的类型所对应字节数

2.指针和数组的关系

int a[10]={1,2,3,4,5,6,7,8,9,10};
int *p;//这是个野指针
p=a;//一旦数组名赋值给指针变量,指针变量就可以当数组名使用(指针变量中存的是数组首元素的地址)
//数组名,代表数组中首元素的地址
//a==&a[0]

​ 数组传参,数组名作为参数传参,需要通过指针变量接收

数组传参

(1)数组传参,可以用一个指针变量接收

void pri(int *p)

(2)数组传参,也可以用一个数组接收,但是在函数内部,数组名会立即退化成指针变量

void pri2(int ap[100])//参数部分,数组大小没意义
int ap[100] 可以理解成 int *ap

​ [注] 以上两种接收方式,都无法知晓数组中元素的个数,必须在传入数组名的同时传入数组元素的个数

void pri(int *p,int n)
void pri2(int ap[],int n)

​ [注] 在函数中返回一个数组名,需要用指针类型的返回值类型

例如:返回一个 int a[10];

int * fun(void)
{
    int a[10];
    return a;
}

八丶const关键字修饰指针

const关键字可以修饰变量(普通变量,指针变量)

const修饰普通变量,被修饰的普通变量 就变为常量(不能直接通过赋值语句修改变量的值)

int const a;//a成了常量
const int a;//a成了常量
a=10;//错
//const修饰的普通变量,变为“只读”变量
const修饰指针变量,被修饰的指针变量有两种情况
int *const pi;(锁定的是地址)//因为const直接修饰的是pi,所以pi不能变,但是*pi可以变
pi=&b;//错
*pi=100;//对
int const * pi;(锁定的是值)//因为const直接修饰*pi,所以*pi不能变,但是pi可以变 

九丶高级指针用法

1.数组指针

int (*arr)[4];
//这是一个数组指针,指针名为arr,用来指向一个数组(int[4])
//数组首元素的地址&array[0]或者array
//数组的首地址&array
arr=&array;

​ [注] 数组指针常和二维数组配合使用

2.指针数组

//用来批量定义指针变量
int *arr[4];
//这是一个数指针数组,数组名为arr,数组arr具有4个元素,每个元素是一个指针变量(int*)
//arr[0],arr[1],arr[2],arr[3]

3.函数指针

​ [注] 函数指针,本质还是一个指针,是用来指向一个函数的指针

//定义一个函数指针
int (*p)(int);
//这是一个指针变量p,用来指向一个函数,这个函数必须是返回值类型为int,带有一个int参数的函数
p=foo;//将函数foo的首地址存入函数指针变量p中
//使用p调用存储在p中的函数
p(10);

​ [需求] 保存10个函数的首地址,需要定义函数指针数组

    int (*p)(int)[10];
    p[0]=foo;
    p[1]=func;
    ......

4.二级指针

int ** pp;//定义了一个二级指针pp,用来指向一个一级指针的
//[需求]--[访问]一级指针变量所在内存单元的数据
//需要使用 二级指针pp来访问一级指针变量p的数据
// 可以使用二级指针变量 改变 一级指针变量 中存的地址(oc中会用到)
int a=10;
int *p=&a;
pp=&p;//二级指针变量pp指向一级指针变量p
*pp=&b;//通过二级指针变量pp修改 所指向的一级指针变量p 中存的地址(让一级指针变量p指向变量b)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容

  • 1.语言中变量的实质 要理解C指针,我认为一定要理解C中“变量”的存储实质, 所以我就从“变量”这个东西开始讲起吧...
    金巴多阅读 1,781评论 0 9
  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,446评论 3 44
  • 一本道来其他系列C语言关键字C语言注释符号一本道来C语言编译预处理技术一本道来 指针的基础 注意本节内容可能在gc...
    PcDack阅读 1,262评论 0 2
  • 指针 指针是什么 为了了解指针的概念,我们先来看一个小故事。话说福尔摩斯派华生到威尔爵士居住的城堡去取回一个重要的...
    去留无意hmy阅读 557评论 0 1
  • 如果,其实本来就没有什么如果。 他是我在高中交的一个男朋友,对我特别的好,我很喜欢他,爱他。 第一次去了重庆读书,...
    糖shan阅读 216评论 0 1