关于指针的总结
关于指针的总结:
1.指针含义:
{
指针其实是一个用于存放内存地址的变量.在内存中跟整形没什么区别,由于他必须保存的数据必须能够唯一标示一个内存单元.所以在32位系统里面只占用两个字节的长度.但是为什么在声明一个指针变量的的时候却要指定是指向哪一种类型的指针呢(eg: int * pInt; float * pFloat;) ? 个人认为是为了方便指针的操作,
因为pInt ++ ;会使 指针 的 指向移动 sizeof(int) 字节大小(32位机器为两个字节).而 pFloat ++; 却会使指针移动 sizeof(float) 字节大小?,
}
2.指针声明:
指向基本类型的指针: int * 变量名;.....
指向结构体的指针: struct myStruct * 变量名;
struct myStruct
{
int a;
int b;
};
声明: struct myStruct * Var;
指向函数的指针:
2 typedef int (*FunctionName)(variableType varA,variableType varB); /*详见 上一篇 随笔 "简单链表练习"*/
这样的话 FunctionName 就成了一种类型;即为: 指向一个返回值 为int ,参数为两个variableType 的函数 的指针 了;
如此一来,我们 便可以想用 基本类型一样 声明一个 FunctionName 成员了.
只是调用 有点不同. eg: FunctionName fn;
fn = F; /*或者 fn = &F; F为一个符合FunctionName 的 函数*/
fn(varA,varB); /*执行函数 F();*/
3.指针操作:
指针可以像其他变量一样进行基本运算,甚至可以直接将一个数字赋给指针变量(类型转换);但是时刻谨记他表示的是一个地址;稍有偏差便会导致程序出错.
4.一些细节和补充:
指针与const限定符: (此处不介绍函数类型. 函数类型只是 函数声明的一种 简便方式.)
const
限定符和指针结合起来常见的情况有以下几种。
const int *a; int const *a;
这两种写法是一样的,a
是一个指向const int
型的指针,a
所指向的内存单元不可改写,所以(*a)++
是不允许的,但a
可以改写,所以a++
是允许的。
int * const a;
a
是一个指向int
型的const
指针,*a
是可以改写的,但a
不允许改写。
int const * const a;
a
是一个指向const int
型的const
指针,因此*a
和a
都不允许改写。
指向非const
变量的指针或者非const
变量的地址可以传给指向const
变量的指针,编译器可以做隐式类型转换,例如:
char c = 'a'; const char *pc = &c;
但是,指向const
变量的指针或者const
变量的地址不可以传给指向非const
变量的指针,以免透过后者意外改写了前者所指向的内存单元,例如对下面的代码编译器会报警告:
const char c = 'a'; char *pc = &c;
即使不用const
限定符也能写出功能正确的程序,但良好的编程习惯应该尽可能多地使用const
,因为:
-
const
给读代码的人传达非常有用的信息。比如一个函数的参数是const char *
,你在调用这个函数时就可以放心地传给它char *
或const char *
指针,而不必担心指针所指的内存单元被改写。 -
尽可能多地使用
const
限定符,把不该变的都声明成只读,这样可以依靠编译器检查程序中的Bug,防止意外改写数据。 -
const
对编译器优化是一个有用的提示,编译器也许会把const
变量优化成常量。
字符串字面值通常分配在.rodata
段,而字符串字面值类似于数组名,做右值使用时自动转换成指向首元素的指针,这种指针应该是const char *
型。我们知道printf
函数原型的第一个参数是const char *
型,可以把char *
或const char *
指针传给它,所以下面这些调用都是合法的:
const char *p = "abcd"; const char str1[5] = "abcd"; char str2[5] = "abcd"; printf(p); printf(str1); printf(str2); printf("abcd");
注意上面第一行,如果要定义一个指针指向字符串字面值,这个指针应该是const char *
型,如果写成char *p = "abcd";
就不好了,有隐患,例如:
int main(void) { char *p = "abcd"; ... *p = 'A'; ... }
p
指向.rodata
段,不允许改写,但编译器不会报错,在运行时会出现段错误。
出处: http://www.cnblogs.com/todototry/
关注语言: python、javascript(node.js)、objective-C、java、R、C++
兴趣点: 互联网、大数据技术、大数据IO瓶颈、col-oriented DB、Key-Value DB、数据挖掘、模式识别、deep learning、开发与成本管理
产品:
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架