ProDeveloperTutorial.com

教程和编程解决方案
菜单
  • Shell脚本
  • 系统设计
  • Linux系统编程
  • 4g LTE
  • 编码问题
  • C
  • C ++
  • DSA
  • GIT

第7章:C语言指针

前开发者教程 七月6,2018

在本章中,我们将研究以下内容

  1. 介绍
  2. 指针的用法
  3. 指针介绍:
  4. 指针声明:
  5. 虚空指针
  6. 野指针
  7. 指针和数组
  8. 指向指针的指针

 

 

1.简介:

指针主题是C语言中最重要和最恐怖的主题之一。因此,我们将一次了解它们。在完成本章时,您将对C指针感到满意。如有任何疑问,请在下面发表评论。

 

2.指针的用法

 

  1. 指针用于节省内存。
  2. 它们用于数据结构,因此执行时间更快。
  3. 指针用于文件处理。
  4. 指针用于动态内存分配。
  5. 指针可用于访问数组元素。

 

注意:C语言中的指针非常强大。如果试图访问无效的内存,程序将崩溃。因此在处理指针时应该采取额外的步骤。

 

 

3.指针介绍:

指针是一个普通变量,用于保存另一个变量的地址。

从前面的章节中我们知道,变量名称是给存储位置指定的名称。因此,指针将保留该内存位置作为其值。

 

4.指针声明:

在处理指针时,我们遇到了两个重要标志。 “ *”和“&”.

 

“ *”称为间接运算符。 它可以以2种不同的方式使用。

  1. 它用于声明指针变量。
  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+章
分享
电子邮件
鸣叫
领英
Reddit
绊倒
Pinterest的 的
上一篇文章
下一篇

关于作者

前开发者教程

每天我们都会讨论竞争性编程问题,请加入我们的网站:   电报频道

ProDeveloperTutorial.com

教程和编程解决方案
版权 © 2020 ProDeveloperTutorial.com
从以下课程获得热门课程: 教育性的



      1. <legend id="Rh73tuu" class="RAcr2Ed"></legend>

              <tfoot id="SellBBy" class="SL82OZN"></tfoot>