在本章中,我们将研究以下内容
- 介绍
- 指针的用法
- 指针介绍:
- 指针声明:
- 虚空指针
- 野指针
- 指针和数组
- 指向指针的指针
1.简介:
指针主题是C语言中最重要和最恐怖的主题之一。因此,我们将一次了解它们。在完成本章时,您将对C指针感到满意。如有任何疑问,请在下面发表评论。
2.指针的用法
- 指针用于节省内存。
- 它们用于数据结构,因此执行时间更快。
- 指针用于文件处理。
- 指针用于动态内存分配。
- 指针可用于访问数组元素。
注意:C语言中的指针非常强大。如果试图访问无效的内存,程序将崩溃。因此在处理指针时应该采取额外的步骤。
3.指针介绍:
指针是一个普通变量,用于保存另一个变量的地址。
从前面的章节中我们知道,变量名称是给存储位置指定的名称。因此,指针将保留该内存位置作为其值。
4.指针声明:
在处理指针时,我们遇到了两个重要标志。 “ *”和“&”.
“ *”称为间接运算符。 它可以以2种不同的方式使用。
- 它用于声明指针变量。
- 它用于从存储的地址中取消引用该值。因此,名称是间接的。
“&”用于获取变量的地址。
指针变量占用的空间将始终为4个字节。
以下示例将详细说明:
#include<stdio.h> int main() { // a simple variable int var = 10; // a pointer vaiable. Here "*" is used to declare a pointer variable. int *ptr = NULL; // assgining the address of "var" with the help of "&" operator // now "ptr" will have the address of variable "var" ptr = &var; // while printing address we should use "%u", as unsigned integers printf("\nThe address of variable var = %u. \n", &var); printf("The value stored in ptr = %u. Notice that the address is same.\n", ptr); printf("The value of var = %d. \n", var); printf("The value of var using ptr = %d. Here * is used as an indirection operator.\n", *ptr); // if we want to change the value of var using pointer, can be done as shown below *ptr = 20; printf("The value of var after changing = %d. \n", var); return 0; }
输出:
The address of variable var = 3796290280. The value stored in ptr = 3796290280. Notice that the address is same. The value of var = 10. The value of var using ptr = 10. Here * is used as an indirection operator. The value of var after changing = 20.
示例2:表明*运算符也可以用于普通变量。
#include<stdio.h> int main() { int var = 10; printf("The value printed using * is = %d\n", *(&var) ); /* what does *(&var) means. * as we know & is used for getting the address. * "*" can be used as an indirection operator, to get the value stored in that address. * * It can be visualized as below: * * *(value at address of var) * output = value */ return 0; }
输出:
The value printed using * is = 10
5.空指针
从一开始我们就知道每个变量都应该与一个类型相关联。但是有时在使用指针时,我们不知道类型。我们可以使用类型转换来分配该指针的类型。
需要注意的一点是,在我们强制转换指针之前,我们将无法取消引用该值。
让我们理解为什么必须使用指针类型?
如前所述,无论数据类型如何,指针的大小均为4个字节。但是在从地址取消引用时,指针将查看数据类型,然后尝试访问这些字节。
例如:
对于整数数据类型,它将取消引用4个字节。
对于短数据类型,它将取消引用2个字节。
对于char数据类型,它将取消引用1个字节。
因此,对于空指针,必须进行类型转换。
#include<stdio.h> int main() { void *vPtr = NULL; int iNum = 10; float fNum = 10.23; vPtr = &iNum; printf("The value of iNum using pointer = %d\n", *(int*)vPtr ); *(int *) vPtr = 20; printf("The value of iNum after changing pointer = %d\n", *(int*)vPtr ); vPtr = &fNum; printf("The value of fNum using pointer = %f\n", *(float*)vPtr ); *(float *) vPtr = 23.45; printf("The value of ifNum after changing pointer = %f\n", *(float*)vPtr ); return 0; }
输出:
The value of iNum using pointer = 10 The value of iNum after changing pointer = 20 The value of fNum using pointer = 10.230000 The value of ifNum after changing pointer = 23.450001
6.野指针
正如我们在上面的程序中看到的那样,在声明指针时,应将其初始化为NULL。否则它将保留垃圾值。这些指针称为野指针。
7.指针和数组
在上一章中,我们了解了数组。实际上,内部数组是一个指针,它指向数组的第一个元素。所有数组元素都连续存储。因此,我们可以使用指针来访问数组成员。
数组表示为
arr [10]
在这里,我们声明了一个指向第一个变量的指针arr。即在内部&arr [0]。因此,当我们内部访问arr [1]时,它将被转换为*(arr + 1)。
通常,arr [i]将为*(arr + i)。
下面的程序显示了访问数组元素的不同方法。
#include<stdio.h> int main() { int arr[] = {1, 2, 3, 4, 5}; printf("arr[i] *(arr + i) *(i + arr) i[arr] address using (arr+i)\n"); for (int i = 0; i < 5; ++i) { printf("%d %d %d %d %u\n", arr[i], *(arr + i), *(i + arr), i[arr], arr+i ); } return 0; }
输出:
arr[i] *(arr + i) *(i + arr) i[arr] address using (arr+i) 1 1 1 1 3853433552 2 2 2 2 3853433556 3 3 3 3 3853433560 4 4 4 4 3853433564 5 5 5 5 3853433568
8.指向指针的指针
作为指针的是一个变量,它保存另一个变量的地址。您如何称呼持有另一个指针地址的变量?是的,指向指针的指针。
保存另一个指针地址的指针变量称为指向指针的指针。
声明为2星“ int ** ptr = NULL; ”
显示指针访问指针的示例:
#include<stdio.h> int main() { int iNum = 1234; int *ptr = &iNum; int **pptr = &ptr; printf("The address of iNum is = %u\n", &iNum ); printf("The address of iNum using pointer %u\n", ptr ); /* * as pointer ptr is holding the address of variable iNum * so while using pointer to pointer we have the address of "ptr". * But to get the value stored inside pointer ptr, we shall access with *ptr */ printf("The address of iNum using pointer to pointer %u\n", *pptr ); printf("===============================================\n"); printf("The value of iNum is = %d\n", iNum ); printf("The value of iNum using pointer is = %d\n", *ptr ); printf("The value of iNum using pointer to pointer is = %d\n", **pptr ); return 0; }
输出:
The address of iNum is = 3982359272 The address of iNum using pointer 3982359272 The address of iNum using pointer to pointer 3982359272 =============================================== The value of iNum is = 1234 The value of iNum using pointer is = 1234 The value of iNum using pointer to pointer is = 1234
该网站上可用的教程列表:
C编程20+章 | C ++编程80+章 |
100多个编码问题 | 数据结构和算法85+章 |
系统设计20+章 | Shell脚本编写12章 |
4g LTE 60+章节 | 最常见的编码问题 |
5G NR 50+章 | Linux系统编程20+章 |