C语言中有很多关于指针的使用,指针也是C语言的灵魂所在,而且C语言中也有很多有关指针的概念,这里学习并总结了一些知道的概念。

常量指针:首先它是一个指针,常量只是用来修饰指针的定语。其定义如下:

char const * cp;

char a='a';

如何识别呢?根据右结合优先,先是*优先,所以这个cp变量是一个指针,然后是const修饰*,所以这是一个常量指针。即指向常量的指针。

cp=&a; //正常语法

*cp=a; //错误语法,因为其指向的值是一个常量

指针常量:首先它是一个常量,指针是用来修饰常量的,即常量的值为一个指针地址。

char * const cp;

char a='a';

如何识别呢?根据右结合优先,先是const优先,所以这个cp变量是一个常量,然后是*修饰const,所以这是一个指针常量。

cp=&a; //错误语法,因为其地址为是一个常量

*cp=a; //正确,地址所指向的内容是一个普通字符

指针数组:首先它是一个数组,指针是用来修饰数组内容的,表示什么样的数组 :即存放指针的数组

char *arr[3] = {"1","123","345"};

如何识别,因为[]的优先级大于*,所以先是定义为一个数组,而后由*来修饰这个数

printf("arr0%c\n",*arr[0]);

printf("arr1%s\n",arr[1]);

数组指针:首先它是一个指针,数组是修饰指针的,即指向数组的指针。

char (*p)[3]; //申明时不能同时初始化

char arr[3] = {'1','4','7'};

p=&arr; //指向数组的首地址,同时指针的类型是char * [3] 类型的,即加1操作后为sizeof(char [3])三个字节数

如何识别:因为这次添加了一个显示优先,所以这次先是一个指针,而后[]修饰指针

printf("%c\n",(*p)[0]); //先取arr的首地址,再根据这个地址取数组内容

printf("%c\n",(*p)[1]);

printf("%c\n",(*p)[2]);

printf("%c\n",*((char*)p+0)); //先转换为char指针,再取值

printf("%c\n",*((char*)p+1));

printf("%c\n",*((char*)p+2));

printf("%c\n",((char*)p)[0]); //先转换为char指针,再取数组的值,和第一个类似

printf("%c\n",((char*)p)[1]);

printf("%c\n",((char*)p)[2]);

函数指针:首先它是一个指针,函数是修饰指针的,即指向函数的指针。

char (*func)(void); //定义函数指针

char test(void)

{

return 'A';

}

func = test; //初始化赋值

printf("test address: %p\n",test);

printf("func address: %p\n",func);

char ch = func(); //调用

printf("%c\n", ch);

如何识别,同数组指针一样,因()的优先级,所以这个定义首先是一个指针,而后才是对指针的描述,即一个指向函数的指针,其指向的函数也是规定的:即返回的是字符类型,不需要传入参数

指针函数:首先它是一个函数,指针修饰函数的返回类型,即一个返回指针的函数

char *func(void);

如何识别,因为没有扩弧,所以*的优先级没有右边的扩弧优先级高,所以先是规定了一个函数,*只是修饰返回值的

char *func(void) {

char *str = "test";

return str;

}

void main() {

char *test = func();

printf("%s\n",test);

}

结构体指针:当然其原先也是一个指针,只不过就是指向了结构体而已。故而为结构体指针。

指针结构体:指针结构体,其实也没有必要有这个概念,无非就是带有指针作为子项的结构体。

指针类型转换:指针类型转换是个有意思的东西,你可以把一个int型的指针转换为char类型,然后再把char类型的指针转换为int型;就像普通的字符和int型之间的转换一样。但指针转换后其值没有变,唯一变的东西就是指针的步长,即进行指针运算时的计算方式。当为char指针时其运算单位均以1个字节为1个运算单位,而当为int指针时通常都是以4个字节为1个运算单位。

指针算术:根据上面的指针类型转换介绍可知,不同的指针类型进行算术运算时其计算方式时不相同的,其不同之处就在于其步长的字节数不同,而具体其步长为几个字节数是以其指针类型决定的,指向char的指针步长即为1。通常的指针运算有指针与数字的加减运算,相同类型的指针的减法运算,而且还要是指向同一个数组的,不然意义不大。同理推得不同类型的指针进行运算意义更不大,甚至会报错。

下面举一个指针算术的例子,交换两个变量值不利用额外变量

毕竟new关键字还是申请了额外的内存,虽然没有申请变量,换汤未换药

int *a,*b;

a=new int(10); //给指针赋值

b=new int(20); //a=0x00030828,b=0x00030840

a=(int*)(b-a); //a=0x00000006

b=(int*)(b-int(a)); //b=0x00030828

a=(int*)(b+int(a)); //a=0x00030840

只是交换变量的话也可以:

int a = 4;

int b = 5;

*(((char*)&a)+1) = *((char*)&b);

*((char*)&b)=*((char*)&a);

*((char*)&a)=*(((char*)&a)+1);

*(((char*)&a)+1)=0;

指针参数:指针参数就是指,指针作为函数的参数进行传递,因为C语言只支持单向传值,且返回值只能是一个值类型,所以想要从函数内返回多个内容或者与函数体有一个共同的数据操作区域,那这个时候就可以考虑通过传指针参数的方式了。传指针也是传值,只不过这时的值为指针指向的地址,也就是一个int整数。通过传递一个地址后就可以对一个共同的区域进行操作和数据共享了。

指针指针:指针的指针就是指向指针的指针,同理还有指向指针指针的指针;不过一般人的思维能做二级、三级的指针的就很好了。这里主要是扩展一下指针与多维数组的关联关系。从个别到一般来分解多维数组的处理。这里个别肯定是用二维数组来举个例子,那就可以延伸到多维数组。

java char指针数组_简单总结C语言中各种类型的指针的概念相关推荐

  1. c语言的各种类型的指针,简单总结C语言中各种类型的指针的概念

    2016 这篇文章主要简单总结了C语言中各种类型的指针的概念,指针可以说是C语言本身所具有的最大特性,平时根据不同使用场合习惯地将其简单分类,需要的朋友可以参考下 C语言中有很多关于指针的使用,指针也 ...

  2. java控件数组_在C# WinForm程序中创建控件数组及相应的事件处理

    控件数组是VB提供的一个优秀的设计解决方案,它能很方便快捷的处理大批同类控件的响应和时间处理,但不知为什么在C#中这个优秀特性没有传承下来,甚为可惜,本文将要探讨就是如何在C# WinForm程序实现 ...

  3. 如何初始化局部变量c语言_【C语言更新】C语言中如何来定义一个指针,并且对其进行初始化...

    文/Edward上一节中,我们利用了一个小知识来介绍了一下指针,在上面这个例子中,小明和小丽手中的这个杯子就好比我们C语言中的变量,它确实是实实在在存放一些有具体意义的数据.这个杯套就类似于C语言中指 ...

  4. 指针数组下标JAVA_Java语言中可用下标和指针两种方式表示数组元素。

    [判断题]一行可以写多条预处理命令 [判断题]如果一个java程序中有多个类,编译后只生成一个字节码文件,其名字同主类名一致. [判断题]Protected类型的实例变量只能在本类中使用,其他类中不可 ...

  5. c语言中赋值的时候顿号的作用,简单总结C语言中的运算符优先级

    简单总结C语言中的运算符优先级 C语言中有很多运算符,除了四则运算,还有位运算.比较运算.逻辑运算.赋值运算等等,令人眼花缭乱的同时,优先级也让人头疼.通常建议在写代码的时候不用省略括号,但是并不是所 ...

  6. c语言字符串二维数组的动态分配应,C语言中动态分配二维数组复习过程.doc

    C语言中动态分配二维数组复习过程.doc C语言中动态分配二维数组在C中动态分配内存的,对于单个变量,字符串,一维数组等,都是很容易的.C中动态分配二维数组的方法,很少有C语言书中描述,我查找了有的C ...

  7. [转]C/C++语言中值传递、指针传递和引用传递

    在C/C++语言中值传递.指针传递和引用传递(C++ only)这三种函数参数传递方式是比较基本的知识,用的比较普遍,但不仔细分析其实质的话,时间长容易记混了.网上的资料也较多但多数都不系统,本文力求 ...

  8. c语言不同类型指针间的强转,C语言中不同的结构体类型的指针间的强制转换详解...

    C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险.只要理解了其内部机制,你会发现C是非常灵活的. 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在 ...

  9. c语言主线程退出子线程,简单了解C语言中主线程退出对子线程的影响

    这篇文章主要介绍了简单了解C语言中主线程退出对子线程的影响,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 对于程序来说,如果主进程在子进程还未结束时 ...

最新文章

  1. usaco Canada Tour
  2. Python 之 pip拒绝访问
  3. 把「我的世界」马赛克变成逼真大片,英伟达又出黑科技
  4. Android VideoView播放网络视频简介(转)
  5. Python回顾与整理12:执行环境
  6. 动态规划之——拦截导弹(nyoj79)
  7. 国立大学 计算机,新加坡国立大学 计算机
  8. 登录方式1:MySQL自带客户端
  9. AndroidStudio创建jinLibs文件夹
  10. Android 系统(230)---OTA 软件包工具
  11. 【★】EIGRP终极解析!
  12. protobuf 安装_Beego 安装时 一直无响应(443)怎么办
  13. 浮沉11年 | 一个互联网老兵的自白书
  14. ifconfig命令举例
  15. spring 事务隔离级别和传播行为_Spring 事务传播行为
  16. VS-c++ 项目新建文件夹
  17. C6678之外部存储器接口EMIF
  18. Beyond Compare比较class文件
  19. Lambda表达式实现机制的分析
  20. 服务器无线存储器,教你把无线路由器打造成网络存储器

热门文章

  1. Java验证(javafx)
  2. 如何在JavaServer Pages中使用Salesforce REST API
  3. Web应用程序中的Spring JDBC入门
  4. 寻找内存泄漏:一个案例研究
  5. 集成框架比较– Spring集成,Mule ESB或Apache Camel
  6. linux中echo命令不输出换行,shell脚本echo输出不换行功能增强实例
  7. 如何设置背景图(前端开发)
  8. MySQL的索引优化
  9. Java程序开发三步骤:编写、编译、运行
  10. springBoot中自定义的yml文件引用的方式