C语言 指针

简单使用如下:

  int *p;//定义

  int a = 10;

  p = &a;//赋值

  int * b = &a;//定义并赋值

定义格式:类型 *指针变量名;

注意事项:

1、一定要先定义后赋值,用完记得清空。

2、%p输出指针里面存储的地址值。

3、清空指针可以用 p = 0;或p = NULL;

代码示例

  1. #include <stdio.h>
  2.  
  3. //结构体指针测试
  4. struct pStruct
  5. {
  6. int a;
  7. float b;
  8. double d;
  9. };
  10.  
  11. //函数指针测试
  12. void pFunc();
  13. int main()
  14. {
  15. int *p ;//定义
  16. int a = ;
  17. p = &a;//赋值
  18. printf("%d\n",*p);
  19. printf("%lu\n",sizeof(p));//指针长度 8
  20.  
  21. char *cp;
  22. char c = 'a';
  23. cp = &c;
  24. *cp = 'g';
  25. printf("%c\n",*cp);//
  26. printf("%lu\n",sizeof(cp));//指针长度 8
  27.  
  28. //指针变量中保存的时变量的地址,地址长度和类型无关,是系统固定的
  29. //指针长度和指针类型无关,和系统字长有关,64位长度位8,32位4
  30. printf("%lu\n",sizeof(char *));//指针长度 8
  31. printf("%lu\n",sizeof(short *));//指针长度 8
  32. printf("%lu\n",sizeof(float *));//指针长度 8
  33. printf("%lu\n",sizeof(double *));//指针长度 8
  34. printf("%lu\n",sizeof(long *));//指针长度 8
  35. //函数指针
  36. void (*pF)();
  37. printf("%lu\n",sizeof(pF));//指针长度 8
  38. //数组指针
  39. int array[];
  40. int *pArray = array;
  41. printf("%lu\n",sizeof(pArray));//指针长度 8
  42. //结构体指针
  43. struct pStruct *pS;
  44. printf("%lu\n",sizeof(pS));//指针长度 8
  45.  
  46. return ;
  47. }

指针与数组

  定义一个指针,指向一个数组;

  int  array[] = {0,2,4,6,8};

  int *p = array;//array[0] ,指向首地址,数组名就是数组的首地址

代码示例

  1. #include <stdio.h>
  2. //指针和数组
  3.  
  4. //输出
  5. void show(int array[],int n);
  6.  
  7. int main()
  8. {
  9.  
  10. //1、指向指针的指针
  11. int a = ;
  12. int *pa = &a;//定义并初始化一级指针
  13. *pa = ;//改变变量的值
  14. printf("一级指针:%d\n",*pa);
  15. int **ppa = &pa;//定义并初始化二级指针,其他三级指针类似
  16. **ppa = ;//通过二级指针改变变量的值
  17. printf("二级指针:%d\n",**ppa);
  18.  
  19. //2、指向一维数组的指针
  20. int array[] = {,,,,};
  21. int *pArray ;//指针
  22. pArray = array;//指向首地址,数组名就是数组的首地址,也可以写array[0]
  23. show(pArray,sizeof(array)/sizeof(int));//输出数组,使用指针传参数
  24.  
  25. //*(++pArray); 和 *(pArray+2);的区别,数组指针的p++,p+2 是指指针向下一个元素的首地址
  26. int nElement1 = * ++pArray;//
  27. pArray = array;//恢复原值
  28. int nElement2 = *(++pArray);//
  29. pArray = array;//恢复原值
  30. int nElement3 = *(pArray+);//
  31. printf("*pArray++:%d \n*(pArray++):%d\n*(pArray+2):%d\n",nElement1,nElement2,nElement3);
  32.  
  33. return ;
  34. }
  35.  
  36. void show(int *array,int n )
  37. {
  38. //遍历数组
  39. printf("数组元素:\n");
  40. for (int i = ; i < n; i ++)
  41. {
  42. printf("%d ",array[i]);
  43. }
  44. printf("\n");
  45.  
  46. }

指针和字符串

1、字符串变量,可修改

char str[] = "hello";

2、字符串常量,不可更改

char *p = "world";

代码示例

  1. #include <stdio.h>
  2. //指针和字符串
  3. /*
  4. 1、字符串变量,可修改
  5. char str[] = "hello";
  6. 2、字符串常量,不可更改
  7. char *p = "world";
  8. */
  9.  
  10. int main()
  11. {
  12. //字符数组,元素可以自由更改.字符串变量
  13. char str[] = "hello";
  14. char *pstr1 = str;//定义指针指向字符串
  15. printf("%s\n",str);
  16. printf("%c\n",*(+pstr1));
  17.  
  18. //字符串指针,这使用和str[]有本质区别,pstr2指向的字符串不能更改,是一个字符串常量
  19. char *pstr2 = "world";
  20. char *pstr3 = "world";//pstr3和pstr2指向同一块内存地址
  21. *pstr2 = 'A';
  22. printf("%s\n",pstr2);
  23. printf("%c\n",*++pstr2);
  24.  
  25. return ;
  26. }

函数指针和指针函数

1、返回指针的函数,就以普通函数,只不过返回值是一个指针

类型名 *函数名(参数列表);

2、函数指针,指向函数地址的指针,是一个指针,而不是函数,指向函数的首地址

返回值类型 (*指针变量名)(参数列表);

函数指针的两种使用方式:

1、 p();

2、 (*p)();

函数指针的主要用途:

  1、调用函数

  2、讲函数作为参数再函数间传递

  1. #include <stdio.h>
  2.  
  3. //返回指针的函数
  4. /*
  5. 1、返回指针的函数
  6. 类型名 *函数名(参数列表);
  7. 2、函数指针,指向函数地址的指针
  8. 返回值类型 (*指针变量名)(参数列表);
  9. 两种使用方式:
  10. 1、 p();
  11. 2、 (*p)();
  12. */
  13.  
  14. char* pFunc();//指针函数
  15. int (*pf)(int ,int );//函数指针
  16. int Function(int ,int);//普通函数
  17.  
  18. int main()
  19. {
  20. int a = ;
  21. int b = ;
  22. int c = ;
  23.  
  24. pf = &Function;//将函数指针指向具体的函数,这是pf就相当于函数本身,不过使用更灵活
  25.  
  26. printf("%d\n",pf(a,b));//第一种引用方式
  27. printf("%d\n",(*pf)(a,b));//第二种引用方式
  28.  
  29. char *addr = pFunc();//获取函数的返回值,是一个地址值
  30. printf("%s\n",addr);//
  31.  
  32. return ;
  33. }
  34.  
  35. //指针函数定义
  36. char* pFunc()
  37. {
  38. char *name = "song";
  39. return name;
  40. }
  41.  
  42. int Function(int a,int b)//普通函数
  43. {
  44. return a+b;
  45. }

2015-4-12 今日如此,明日依旧。

IOS开发学习笔记006 - 指针的更多相关文章

  1. iOS开发学习笔记:基础篇

    iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境 ...

  2. ios开发学习笔记(1)

    objective-c基础总结 第一二章 1.application:didiFinishLauchingWithOptions:程序启动后立即执行 2.启动界面代码格式:self.window = ...

  3. ios开发学习笔记(这里一定有你想要的东西,全部免费)

    1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用). 其实在代码里还是可以设置的,那就是删除背景view [ ...

  4. iOS开发学习笔记

    1 常用的第三方工具 1.1 iPhone Simulator 测试程序需要模拟器iPhone Simulator 1.2 设计界面需要Interface Builder,Interface Buil ...

  5. IOS开发学习笔记017-第一个IOS应用

    第一个IOS应用程序,就从最简单的开始吧. 1.先了解一下开发环境,Xcode的相关组成 2.还有模拟器 3.运行与停止按钮 4.新建一个工程 5.看看main函数里都有啥 6.现在来添加一个控件 1 ...

  6. IOS开发学习笔记014-ARC机制

    ARC 1.ARC机制 2.ARC 判断准则 3.注意事项 4.ARC和非ARC混合使用 ARC机制 ARC 是编译器特性,而不是 iOS 运行时特性,它也不是类似于其它语言中的垃圾收集器.因此 AR ...

  7. IOS开发学习笔记013-内存管理

    内存管理 1.基本知识 2.关闭ARC机制 3.@property 4.循环引用 5.自动释放池 6.内存管理总结 一.基本知识 内存的分类 栈:局部变量 堆:动态申请的对象,变量等 全局(静态):s ...

  8. IOS开发学习笔记010-面向对象的三大特性

    面向对象的三大特性 1.封装 2.继承 3.多态 一.封装 将类内部的属性保护起来,在外部不能直接访问,那么如果需要访问怎么办呢? OC提供了set方法来对成员变量进行访问 set方法 1.作用:提供 ...

  9. IOS开发学习笔记009-OC基本知识

    开始学习OC,时间不等人啊,要抓紧了. OC基本知识 新建一个以.m结尾的文件,这既是oc的程序文件.在oc程序中完全兼容C语言.编译好链接类似. oc包含头文件是使用#import <> ...

随机推荐

  1. Masonry 等间隔或等宽高排列多个控件

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  2. extends 继承

    继承的作用:子类可以直接拥有父类成员:其中,私有成员和构造函数不参与继承: java中类继承的特点:只支持单一继承和多重继承,不支持多继承(一个类不能同时继承多个类) 继承中成员变量的特点:子类中可以 ...

  3. ubuntu16.04解决屏幕适应问题

    打开ubuntu登录进去后,输入: sudo  apt-get installopen-vm-tools sudo apt-get install open-vm* 然后重启(reboot),即可解决 ...

  4. .NET中异常类(Exception)

    异常:程序在运行期间发生的错误.异常对象就是封装这些错误的对象. try{}catch{}是非常重要的,捕获try程序块中所有发生的异常,如果没有捕获异常的话,程序运行的线程将会挂掉,更严重的是这些错 ...

  5. 自动化构建工具gulp的基础了解

    1.使用gulp的步骤 1.安装node检测是否安装好 cmd->node -v2.安装gulp 可以在npm或者在cnpm3.在node里面有个文件package.json.利用命令行npm ...

  6. python基础一 day17 复习

    # 迭代器# 生成器进阶 # 内置函数 # 55个 # 带key的 max min filter map sorted # 思维导图上红色和黄色方法必须会用 # 匿名函数 # lambda 参数,参数 ...

  7. solr 近实时搜索

    摘要: Solr的近实时搜索NRT(Near Real Time Searching)意味着文档可以在索引以后马上可以被查询到. Solr不会因为本次提交而阻塞更新操作,不会等待后台合并操作(merg ...

  8. Oracle ORA-01722 无效数字

    ORA-01722 无效数字 以下几种情况,数据库会报“ORA-01722 无效数字”错误: ① 对于两个类型不一致,一个“数字类型”,一个“非数字类型”进行赋值,或者比较操作: ② to_numbe ...

  9. 安装mysql提示This application requires .NET framework 4.0.

    问题描述:安装MySQL社区版时遇到This application requires .NET framework 4.0. 解决方法:在http://search.microsoft.com/zh ...

  10. VueX源码分析(3)

    VueX源码分析(3) 还剩余 /module /plugins store.js /plugins/devtool.js const devtoolHook = typeof window !== ...