亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C 中的指针:C 编程中的指针是什么?类型

什么是 C 中的指针?

指针 在 C 中,是一个存储另一个变量地址的变量。指针也可用于引用另一个指针函数。指针可以递增/递减,即指向下一个/上一个内存位置。指针的目的是节省内存空间,实现更快的执行时间。

如何在 C 中使用指针

如果我们声明一个int类型的变量v,v实际上会存储一个值。

v 现在等于 0。

但是,每个变量除了值之外,还有它的地址(或者,简单地说,它在内存中的位置)。可以通过在变量名前加上一个 &号来检索地址。

如果你在屏幕上打印一个变量的地址,它看起来就像一个完全随机的数字(而且,它可能会因运行而异)。

让我们用 C 示例中的指针来实践一下吧

这个程序的输出是-480613588。

现在,什么是指针?指针将存储变量的地址,而不是存储值。

指针变量

int *y =&v;

VARIABLEPOINTERA 存储在命名 存储/内存地址A 变量 指向 另一个的存储/内存地址 变量

声明一个指针

与变量一样,C 编程中的指针必须先声明,然后才能在程序中使用。只要遵循 C 的命名规则,指针就可以任意命名。指针声明的形式如下。

data_type * pointer_variable_name;

在这里,

让我们看看这个 C 指针教程中的一些有效指针声明:

int    *ptr_thing;            /* pointer to an integer */ 
int *ptr1,thing;/* ptr1 is a pointer to type integer and thing is an integer variable */
double    *ptr2;    /* pointer to a double */
float    *ptr3;      /* pointer to a float */
char    *ch1 ;       /* pointer to a character */
float  *ptr, variable;/*ptr is a pointer to type float and variable is an ordinary float variable */

初始化一个指针

声明一个指针后,我们像标准变量一样用变量地址初始化它。如果 C 编程中的指针没有未初始化并在程序中使用,结果是不可预测的,并且可能是灾难性的。

要获取变量的地址,我们使用与号 (&) 运算符,放置在我们需要其地址的变量的名称之前。指针初始化使用以下语法完成。

指针语法

 pointer = &variable;

下面给出一个简单的指针说明程序:

#include <stdio.h>
int main()
{
   int a=10;    //variable declaration
   int *p;      //pointer variable declaration
   p=&a;        //store address of variable a in pointer p
   printf("Address stored in a variable p is:%x\n",p);  //accessing the address
   printf("Value stored in a variable p is:%d\n",*p);   //accessing the value
   return 0;
}

输出:

Address stored in a variable p is:60ff08
Value stored in a variable p is:10
操作员 意义 *服务于 2 个目的

  1. 指针声明
  2. 返回被引用变量的值
仅用于 1 个目的(&S)

C 中的指针类型

以下是不同的 C 中的指针类型

空指针

我们可以通过在指针声明期间分配空值来创建空指针。当您没有为指针分配任何地址时,此方法很有用。空指针始终包含值 0。

下面的程序说明了空指针的使用:

#include <stdio.h>
int main()
{
	int *p = NULL; 	//null pointer
	printf(“The value inside variable p is:\n%x”,p);
	return 0;
}

输出:

The value inside variable p is:
0

空指针

在 C 编程中,void 指针也称为泛型指针。它没有任何标准数据类型。 void 指针是使用关键字 void 创建的。可以用来存储任意变量的地址。

以下程序说明了 void 指针的使用:

#include <stdio.h>
int main()
{
void *p = NULL; 	//void pointer
printf("The size of pointer is:%d\n",sizeof(p));
return 0;
}

输出:

The size of pointer is:4

野指针

如果指针没有被初始化为任何东西,则称它为野指针。这些类型的 C 指针效率不高,因为它们可能指向一些未知的内存位置,这可能会导致我们的程序出现问题,并可能导致程序崩溃。使用野指针时应始终小心。

下面的程序说明了野指针的使用:

#include <stdio.h>
int main()
{
int *p; 	//wild pointer
printf("\n%d",*p);
return 0;
}

输出:

timeout: the monitored command dumped core
sh: line 1: 95298 Segmentation fault      timeout 10s main

'c'中其他类型的指针如下:

直接和间接访问指针

在 C 中,有两种等效的方式来访问和操作变量内容

让我们借助下面的程序来理解这一点

#include <stdio.h>
/* Declare and initialize an int variable */
int var = 1;
/* Declare a pointer to int */
int *ptr;
int main( void )
{
/* Initialize ptr to point to var */
ptr = &var;
/* Access var directly and indirectly */
printf("\nDirect access, var = %d", var);
printf("\nIndirect access, var = %d", *ptr);
/* Display the address of var two ways */
printf("\n\nThe address of var = %d", &var);
printf("\nThe address of var = %d\n", ptr);
/*change the content of var through the pointer*/
*ptr=48;
printf("\nIndirect access, var = %d", *ptr);
return 0;}

编译程序没有任何错误后,结果是:

Direct access, var = 1
Indirect access, var = 1

The address of var = 4202496
The address of var = 4202496

Indirect access, var = 48

C 中的指针算法

指针操作总结如下图

优先操作(优先级)

在使用 C 指针时,我们必须遵守以下优先级规则:

  • 运算符 * 和 &具有与一元运算符相同的优先级(否定!、递增++、递减-)。
  • 在同一个表达式中,一元运算符 *、&、!、++、– 的计算顺序是从右到左。

如果一个 P 指针指向一个 X 变量,那么 *P 可以用在 X 可以写的任何地方。

以下表达式是等价的:

整数 X =10

int *P =&Y;

对于上面的代码,下面的表达式是正确的

表达式等效表达式Y=*P+1

*P=*P+10

*P+=2

++*P

(*P)++

Y=X+1

X=X+10

X+=2

++X

X++

在后一种情况下,需要括号:因为一元运算符 * 和 ++ 是从右到左计算的,如果没有括号,指针 P 将递增,而不是 P 指向的对象。

下表显示了处理 C 指针时可以使用的算术和基本操作

操作 解释 赋值 *P1,*P2
P1=P2;
P1和P2指向同一个整数变量Incrementation和decrementationInt *P1;
P1++;P1–;添加偏移量(常量)这允许指针移动表格中的 N 个元素。
指针将增加或减少 N 倍于变量类型的字节数。
P1+5;

C 指针和数组示例

传统上,我们使用其索引访问数组元素,但这种方法可以通过使用指针来消除。指针使访问每个数组元素变得容易。

#include <stdio.h>
int main()
{
    int a[5]={1,2,3,4,5};   //array initialization
    int *p;     //pointer declaration
               /*the ptr points to the first element of the array*/

    p=a; /*We can also type simply ptr==&a[0] */
    
    printf("Printing the array elements using pointer\n");
    for(int i=0;i<5;i++)    //loop for traversing array elements
    {
        	printf("\n%x",*p);  //printing array elements
        	p++;    //incrementing to the next element, you can also write p=p+1
    }
    return 0;
}

输出:

1
2
3
4
5

将特定数字添加到指针会将指针位置移动到通过加法运算获得的值。假设 p 是当前指向内存位置 0 的指针,如果我们执行以下加法运算, p+1 则它将以这种方式执行:

由于 p 加 1 后当前指向位置 0,所以值会变为 1,因此指针会指向内存位置 1。

C 指针和字符串示例

字符串是 char 对象的数组,以空字符“\0”结尾。我们可以使用指针来操作字符串。 C 示例中的这个指针解释了本节

#include <stdio.h>
#include <string.h>
int main()
{
char str[]="Hello Guru99!";
char *p;
p=str;
printf("First character is:%c\n",*p);
p =p+1;
printf("Next character is:%c\n",*p);
printf("Printing all the characters in a string\n");
p=str;  //reset the pointer
for(int i=0;i<strlen(str);i++)
{
printf("%c\n",*p);
p++;
}
return 0;
}

输出:

First character is:H
Next character is:e
Printing all the characters in a string
H
e
l
l
o

G
u
r
u
9
9
!

处理字符串的另一种方法是使用指针数组,如下例所示:

#include <stdio.h>
int main(){
char *materials[ ] = {  "iron",  "copper",  "gold"};
printf("Please remember these materials :\n");
int i ;
for (i = 0; i < 3; i++) {
  printf("%s\n", materials[ i ]);}
  return 0;}

输出:

Please remember these materials:
iron
copper
gold

C 中指针的优点

  • 指针对于访问内存位置很有用。
  • 指针提供了一种访问数组结构元素的有效方式。
  • 指针用于动态内存分配和释放。
  • 指针用于构成链表、图、树等复杂的数据结构。

C中指针的缺点

  • 指针有点难以理解。
  • 指针可能会导致各种错误,例如分段错误,或者可以访问根本不需要的内存位置。
  • 如果为指针提供了不正确的值,可能会导致内存损坏。
  • 指针也会导致内存泄漏。
  • 指针比变量慢。
  • 程序员发现使用指针非常困难;因此,小心操作指针是程序员的责任。

总结:

  • 指针只不过是存储数据的内存位置。
  • 使用指针访问内存位置。
  • 有多种类型的指针,例如空指针、野指针、空指针和其他类型的指针。
  • 指针可以与数组和字符串一起使用,以更有效地访问元素。
  • 我们可以创建函数指针来动态调用函数。
  • 可以对指针进行算术运算,称为指针算术。
  • 指针还可以指向函数,这样在定义指针数组的情况下可以轻松调用不同的函数。
  • 当你要处理不同的变量数据类型时,可以使用类型转换的 void 指针。

C语言

  1. C# 变量和(原始)数据类型
  2. C 编程中用户定义函数的类型
  3. C 指针
  4. 带有示例的 C++ 指针
  5. 什么是 3D 打印?工作原理 |类型 |应用程序
  6. Java - 变量类型
  7. C - 指针
  8. C++ 变量类型
  9. Python - 变量类型
  10. 什么是焊接?- 定义 |焊接类型
  11. 什么是铸造?- 定义|铸造类型
  12. 7种技术是什么?