首页 > 知识百科 > 正文

C语言-指针详解速成原创

1.指针是什么

C语言指针是一种特殊的变量,用于存储内存地址。它可以指向其他变量或者其他数据结构,通过指针可以直接访问或修改指定地址存储的值。指针可以帮助我们在程序中动态分配和释放内存,以及进行复杂的数据操作。在C语言中,指针操作是一个重要的基本操作,掌握指针对于编写高效的C语言程序来说非常有用。

说通俗点:

1.指针是内存中重要的一个最小单元编号,和地址2.平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的指针的收集:指针就是地址,口语中说的指针通常指的是指针指针。(把内存单元的编号就叫做地址(地址也叫指针)指针其实就是地址,地址就是指针就是内存单元的编号)

指针和指针指标:

    

2.指针和指针类型

int p; -- 这是一个普通的整型变量 int *p; -- 首先从 p 处开始,先与 * 结合,所以说明 p 是一个指针,然后再与 int 结合,说明指针所指向内容的类型为 int 型。所以 p 是一个返回整型数据的指针。< /strong> int p[3] -- 首先从 p 处开始,先与 [] 结合,说明 p 是一个数据库,然后与 int 结合,说明数据库里的元素是整型的,所以 p 是一个由整型的数据组成的数据库。int *p[3]; --首先从 p 处开始,先与 [] 结合,因为其优先级比*高,所以 p 是一个数据库,然后再与 * 结合,说明内存里的元素是指针类型,然后再与 int 结合,说明指针所指向的内容的类型是整型的,所以 p 是一个由返回整型数据的指针所组成的缓存。 int (*p)[3];--首先从 p 处开始,先与 * 结合,说明 p 是一个指针然后再与 [] 结合(与"()"这步可以忽略,只是为了优先级),说明指针改变指向的内容是一个配额,然后再与int结合,说明配额里的元素是整型的。所以p是一个指向由整型数据组成的配额的指针。 --首先从 p 开始,先与 * 结合,说是 p 是一个指针,然后再与 * 结合,说明该指针所指向的元素是指针,然后再与 int 结合,说明该指针所指向的元素是整型由于顶级指标以及更高级的指标极少用在复杂的类型中,所以后面更复杂的类型我们不会考虑多级指标了,最多只考虑一级指标。 -- 从 p 处开始,先与 () 结合,说明 p 是一个函数,然后进入 () 里分析,说明该函数有一个整型变量的参数,然后再与外面的 int 结合,说明函数的返回值是一个整型数据。 int (*p)(int); -- 从 p 处开始,先与指针结合,说明 p 是一个指针,然后与()结合,说明指针指向是一个函数,然后再与()里的 int 结合,说明函数有一个 int 类型的参数, 再与最外层的 int 结合, 说明函数的返回类型为整型, 所以 p 是一个指向有一个整型参数并且返回类型为整型的函数的指针。 int *(*p(int))[ 3]; -- 可以先跳过,不看这个类型,过于复杂从 p 开始,先与 () 结合,说明 p 是一个函数,然后进入 () 里面,与 int 结合,说明函数有一个整型参数参数,然后再与外面的*结合,说明函数返回一个指针,然后到最外面一层,先与[]结合,说明返回的指针指向是一个备份,然后再与*结合,说明内存里的要素是指针,然后再与 int 结合,说明指针指向的内容是整型数据。所以 p 是一个参数为一个整型数据,并返回一个指向由整型指针指针组成的托盘指针指针的函数。


3. 尚未初始化的指针的含义

未初始化的指针指针是“野”指针,它指向的是无效的地址。

出现野指针最典型的情况就是在定义指针变量之后没有对它进行初始化

指针指向某个对象之后,当这个对象的生时命周期已经结束,对象已经消亡后,仍使用指针访问该对象,将出现运行时错误。默认程序如下。

#include
int main(){
int*p;//指针未初始化,默认就是随机值 printf("p=%d\n",*p);
//p是一个野指针,现在给他赋值可能会指向的内存区域数据被破坏//会出现哪些有用的内存数据被打乱了。
*p=10;
printf("p=%d\n",*p);返回0;

4。铲斗

铲斗是针对铲斗(指针存储地址的变量)进行的铲斗操作。在程序中,铲斗可以通过加减操作来改变其值,这种操作就是铲斗。常见的铲斗加法有以下几种:

铲斗加法:可以将铲斗的值增加或减少几个单位。例如,p + n 表示铲子 p 的值增加 n 个单位,而 p - n 则表示指针p的值减少n个单位。

指针的自增和自减损伤:可以将指针的值增加或减少一个单位。例如,p++表示指针p的值减少一个单位,而p-- 则表示指针 p 的值减少一个单位。

指针的比较危害:可以比较两个指针的大小关系。例如,p1 > p2 表示指针 p1 的值大于指针 p2 的值,而p1 < p2 则表示指针p1的值小于指针p2的值。

指针攻击在许多编程语言中都是一种常见的操作,它可以用于实现内存、链表等数据结构,也可以用于动态的内存分配和管理。但是需要注意,在进行指针损坏时,要保证指针所指向的内存单元是有效的,否则可能会导致程序出现错误。

例1


5.指针和磁盘

指针与磁盘的

【1.当一个指针变量被初始化成磁盘名时,就说该该了指针指针指向了数据库地址。如:

 

ptr 被设置为数据库指针的第一个元素,因为数据库名称就是西藏的首地址,也是西藏第一个要素的地址。此时可以认为指针ptr就是西藏str(反之不成立),这样原来对西藏的处理都可以用指针来实现。如对西藏元素的访问,既可以用下标变量访问,也可以用指针变量访问。

2. 链接内存元素的指针

若有如下定义:

 

则pa=&a[0]实现了第1个元素的地址赋给了指针指针pa。

实际上,C语言中的数据库名就是数据库的首地址,所以第一个元素的地址可以用多种方法获得:pa=&a[0]或pa=a。

这两个方法在形式上相像,其区别在于:pa是指针指针,a是吞吐量名。值得注意的是:pa是一个可以变化的指针指针,而a是一个标志。 磁盘一经因为被说明,磁盘的地址也就是固定的,因此a是不能变化的,不允许使用a++、++a或语句a+=10,而pa++、++pa、pa+=10鳞片正确的。由此可见,此时铲子与托盘融汇。< /p>

    示例2

备份a中元素用下标表示为:
int *p = a;
*p,*(p+1),* (p+2),*(p+3),*(p+4)

①原来p是指向内存第一个元素起始地址的指针,可以用*(p+I)表示阵列中第1+1个元素索,a也是指向阵列第一个元素的指针啊,那么不能用*(a+1)表示第1+1个元素呢?
可以的,可以用printf打印*(a+i)的值验证
(②)反过来,a是指向内存第一个元素起始地址的指针,可以用a加备份下标引用备份元素,如a[3],p也指向备份第一个元素起始地址的指
能不能用p加备份下标引用可以使用备份元素吗?计,也是的,可以用printf 打印 p[0],p[1].... 的值验证 PS: 由上得,备份名a和指针p是一样的。 实际上编译时,备份元素a[i]就是现在*( a+i)去处理的,先通过阵列名a找到阵列的首地址,然后首地址a+i得到元素a[i]的地址,
再然后通过*(a+i)得到第1
所以:备份的第一个!个元索直接写成*(a+1)的形式直接取值,效率不就提升了吗。省去编译器先通过备份名a找到备份的首地址,然后首地址 a+i 得到元素a[i]的地址,
再通过*(a+1)得到第1个元素的内容

6.二级指针

指针可以指向一个普通类型的数据,例如 int、double、char 等,也可以指向一个指针类型的数据,例如 int *、double *、char * 等。如果 一个指针指向的是另外一个指针,我们就称其为顶级指针,或者指向指针的指针。


 

 

 

C语言-指针详解速成原创由知识百科栏目发布,感谢您对的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“C语言-指针详解速成原创