指针

指针.png

一、指针

为了正确的访问内存单元,每个内存单元都有一个编号。内存单元的编号称作地址

访问方式:
直接访问:直接访问内存单元中的内容 例 a = 20;
间接访问:通过访问内存单元的编号(地址)以及数据多占字节数访问内存中的数据
(间接访问随处可见,指针就是间接访问的常用方式)

1.指针定义:存放内存地址的变量
int *p = NULL;//初始值: NULL 恒等于 0
//指针所占字节数只与  操作系统位数  有关


①指针类型转换符(占位符):  %p
printf("p = %p\n",p);

②取地址符:&
 int a = 3;
 int *p = &a;
 printf("&a = %p\n",&a);
 printf("p = %p\n",p);

③取值运算符:*
int a = 3, b = 5;
int *p = &a;
printf("%d\n", *p);
   p = &b;
  *p = 100;
printf("%d\n", b);
2.指针的算术运算:只有加、 减运算
int a = 3;
int * p = &a;
p++; //向⾼高位移动四个字节 !
p--; //向低位移动四个字节!

//注意:指针类型决定移动几个字节
3.指针的重指向:指针变量的赋值意味着重指向

注意:p:在指针定义时,只起修饰作用
在指针变量取值时,*表示取p地址内存里的内容

4.数组的内存地址

数组:用连续内存空间存储数据的构造类型
注意:数组名 即 整个数组的 首地址

例:int arr[3] = {1,3,7};
       arr 恒等于 &arr[0]
5.指针与数组

指针可以当数组名用
指针和数组的区别:①所占空间不同,指针只与操作系统位数有关,数组与元素个数和类型有关
②数组名是常量地址,不可以重指向

6.指针与字符串

同数组一样,字符数组名及即数组指针首地址

7.指针数组

定义:存放指针的数组
char *strings[3] = { "iOS", "Android", "Win10"};

8.指针与函数

指针作为参数
void swap(int *a,int *b);

9.函数调用时,,实参只是拷贝形参的值,形参改变并不会改变实参的值

二、指针高级

10.结构体指针

定义:
指向结构体变量的指针

typedef struct student Stu;

Stu stu1 = {0};

Stu * p = &stu1;

访问:


11.结构体数组

与指针的关系
结构体数组名是一个结构体指针常量


结构体指针为函数参数

函数声明:

void printStudents(  
    Stu* pstu,
    int count
);

函数操作结构体数组时,需要传入首地址和元素个数

12.预编译指令

普通宏:
宏定义:(预编译进行替换)例:#define PI 3.1415
命名规则:纯大写 或者 k+驼峰式

带参数的宏:
#define MULL(A,B) ((A)*(B)) //加括号是为了防止手操作符优先级的影响
条件编译:

作用:按不同条件,编译不同的代码

形式一:

#ifdef  标示符 代码段1 #else 代码段2 #endif  

//如果 标示符 被#define 过,编译器编译代码段1,否则编译代码段2

形式二:

#ifndef 标示符 代码段1 #else 代码段2 #endif

//如果 标示符 未被 #define过 编译器编译代码段1,否则编译代码段2

形式三:

#if 常量表达式 代码段1 #else 代码段2 #endif

//如果 常量表达式 结果非0 编译器编译代码段1,否则编译代码段2

三、函数指针

1.定义:
int maxValue(int a,int b)
{
    return a > b  ? a : b;
}//函数名同数组名一样 是地址

指针可当函数用:
int *p = maxValue;
int m = p(3,5);
2、回调函数

函数指针做参数:
int value = getValue(3,5,maxValue);//getValue执行的过程中再调用(回调)maxValue

3.动态排序

排序类:if条件 (声明 BOOL类型)

#import <Foundation/Foundation.h>
typedef struct student{
    char name[20];
    int age;
    int score;
}Stu;
BOOL cmpByAge(Stu *s1,Stu *s2);
BOOL cmpByAge(Stu *s1,Stu *s2)
{
    return s1->age > s2->age;
}
BOOL cmpByName(Stu *s1,Stu *s2);
BOOL cmpByName(Stu *s1,Stu *s2)
{
    return strcmp(s1->name, s2->name);
}
BOOL cmpByScore(Stu *s1,Stu *s2);
BOOL cmpByScore(Stu *s1,Stu *s2)
{
    return s1->score > s2->score;
}
void sortArr(Stu *s,int count,BOOL (*p)(Stu *,Stu *));
void sortArr(Stu *s,int count,BOOL (*p)(Stu *,Stu *))
{
    for (int i = 0 ; i < count - 1; i ++) {
        for (int j = 0; j < count - 1 - i; j ++) {
            if (p(&s[j],&s[j + 1])) {
                Stu temp = {0};
                temp = s[j];
                s[j] = s[j + 1];
                s[j + 1] = temp;
            }
        }
    }
}
int main(int argc, constchar * argv[]) {
  
    Stu s1 = {"aaa",17,80};
    Stu s2 = {"bbb",18,70};
    Stu s3 = {"ccc",22,60};
    Stu s4 = {"ddd",15,90};
   
    Stu stuArr[4] = {s1,s2,s3,s4};
   
    BOOL (*p)(Stu *,Stu *);
   
    printf("请输入0~2,分别按姓名、年龄、成绩排序:\n");
   
    int a = 0;
    scanf("%d",&a);
    switch (a) {
        case 0:
            p = cmpByName;
            break;
        case 1:
            p = cmpByAge;
            break;
        case 2:
            p = cmpByScore;
            break;
        default:
            break;
    }
    sortArr(stuArr, 4, p);
    for (int i = 0; i < 4; i ++) {
        printf("%s,%d,%d\n",stuArr[i].name,stuArr[i].age,stuArr[i].score);
    }

4.函数返回值是指针函数

typedef int (*PFUN)(int,int);

相当于把这个类型的指针 int (*) ( int,int ) 定义一个新名字 PFUN

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,639评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,277评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,221评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,474评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,570评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,816评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,957评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,718评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,176评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,511评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,646评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,322评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,934评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,755评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,987评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,358评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,514评论 2 348

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,430评论 3 44
  • void* 类型指针:通用变体类型指针;可以不经转换,赋给其他指针,函数指针除外;malloc返回的就是void*...
    冰吉凌阅读 3,317评论 0 18
  • 1.语言中变量的实质 要理解C指针,我认为一定要理解C中“变量”的存储实质, 所以我就从“变量”这个东西开始讲起吧...
    金巴多阅读 1,739评论 0 9
  • 转自CSDN博客 原文链接:http://blog.csdn.net/xinyuwuxian/article/de...
    傻彬儿阅读 728评论 0 0
  • 黑夜没有了眼睛 只有月亮在流泪 星辰都去哪儿了 找不到该有的安慰 可怜的言语 在孤寂的空间里开始发酵 多么渴望酿造...
    忆清欢阅读 342评论 0 4