不就是C语言指针吗? 指针篇

"本文详细介绍了C语言中的指针,包括指针的定义、作用和常见运算。指针是一个保存变量地址的变量,能够用于访问数组、表示链表结构并能在函数间传递多个值。通过指针,可以实现对数组的高效操作,如从零开始的索引以及通过指针遍历数组。此外,文章还讨论了指针运算,如指针加减和间接运算符*的作用。空指针NULL和空字符''也在文中有所提及,它们在C语言中扮演着重要的角色。"
摘要由CSDN通过智能技术生成

指针是什么?

  • 定义

关于指针,C语言圣经K&R(C程序设计语言)的介绍是指针是一种保存变量地址的变量,在C语言中,使用非常广泛。
对于C语言标准对指针的定义是:
指针类型(Pointer type)可以由函数类型、对象类型或不完全类型派生,派生指针类型的类型称为被引用类型(referenced type)。
指针类型描述了一种对象,其值用于引用 被引用类型 的实体。由被引用类型构造指针类型的过程称为“指针类型的派生”。由被引用类型T 派生的指针类型称为“指向T的指针”。
简单来说,指针类型是其他类型派生的,上文所说的被引用类型T 派生的指针类型称为“指向T的指针”。
e.g.: int a =0; int *p =&a;

p指向int的指针类型
易混淆点:
指针类型和int型一样,也存在类型、变量和值。即对应着指针的 被引用指针类型(如上题指向int类型指针)、指针类型变量(上题中p变量)和指针类型的值(整型a的地址)。但这三个概念经常被统称为指针,请不要再混为一谈。

要点:

指针应该由三个部分组成,指针类型、指针变量和指针值(内存地址)。先有指针类型,因为有了指针类型,所以有指针变量和指针类型的值。而指针类型的值就是内存的地址。

C指针终端输出

指针与变量故事篇

这是一个感人又真实的故事,被引用类型(比如int这位女士)把唯一的地址(家和钥匙都给了指针),告诉指针,下次地址(int家)随便来,我和地址都是你的,干啥随你,只要不拆房子都可(改不了int变量的地址)。来个闲的蛋痛文学大哥把这故事编下去!
嘿!!可恶的是指针这个家伙,却可以选择其他的int型变量(异性的小姐姐),寻欢去了。内容模块待更新,求助!!!

为啥要用指针

  • 能从函数返回多个值
  • 访问数组
  • 表示链表、树形结构数据结构

函数返回多个值

get_xy函数通过运用指针给main函数参数x,y写入值,并返回值。这是c语言局部变量唯一写入的方法。
double *x_p = &x; double *y_p = &y;参数函数完成了这一步。

#include <stdio.h>
void get_xy(double *x_p,double *y_p)
{
	printf("&x_p address is %p,y_p adress is %p\n",(void *)&x_p,(void *)&y_p);//输出形参x_p,y_p的地址 
	*x_p = 255.1;
	*y_p = 1024.0;
}
int main()
{
	double x,y;
	printf("& x address is %p,y adress is %p\n",&x,&y);//输出实参x,y地址 
	printf("& x address is %p,y adress is %p\n",(void *)&x,(void *)&y);//输出实参x,y地址 
	get_xy(&x,&y); //main函数x,y作为参数传给get_xy,并对x,y进行了写值操作
	printf("x value is %f,y value is %f\n",x,y); //输出get_xy函数的x与y
}

访问数组

  • 为什么数组要从零开始,明明人类计数是从1开始的呀。众所周知,c语言是特点就是过程性。

    e.g.:毋庸置疑,没谈恋爱时期就是单身时段。有两段单身时间,那么我有几次恋爱时期?对吧,一次。再举个栗子,我要去十堰、武汉、无锡和苏州每个城市,要坐几次高铁?3次对吧。过程是计数减一。

  • 使用方便
    二维数组是数组中数组。有多种表示方式,其中一种就是用一维数组代替长度可变的二维数组。
    一位数组代替二维数组
    array[line*width+col] //width行的宽度、line行数和col列
    如上代码 如果行数从1开始肯定丢失一行数据。

得在行数减一,行数从零开始就可以解决。

array[[line-1]*width+col] //width行的宽度、line行数和col列
  • 数组与指针的微秒关系
    对指针加n,则指针前进“该指针所指向的类型的长度*n”。
#include <stdio.h>
int main(void)
{
	int i;
	int array[10];
	int *p;
	for(i=0;i<5;i++)
	{
		array[i]=i;  //array数组赋值
	}
	for(i=0;i<5;i++)
	{
		printf("array[%d]is%d\n",i,array[i]);
	}
	for(i=0;i<5;i++){
		printf("&array[%d] addr is%p\n",i,&array[i]); //打印array[i] 直接取地址 
	}
	printf("\t\n"); 
	for(i=0;i<5;i++){
		printf("&array[%d] addr is%p\n",i,(void*)&array[i]); //array[i] 按照printf%p输出格式输出地址 
	}
	printf("指针输出方式\n");
	printf("\t\n");
	for(p = &array[0];p != &array[5];p++)
	{
		printf("*p is %d \t,&p addr is %p\n",*p,(void *)p); //指针方式输出数组值和地址 
	}
	return 0;
}

数组指针

下标运算符[]和数组没有关系

在表达式中,数组都会被解读成指向初始元素的指针(当然有3种例外)。

/*这两种p指针指向array数组并没有区别*/
int array[5]={1,2,3,4,};
int *p;
p = & array[0];
P = array;  
/*  p指针运算 *(p+2)和p[2]一样 p[2]是*(p+2)的简便写法  */
printf("(p+2) is %d\n",*(p+2));
printf("(p[2] is %d\n",p[2]);
#include <stdio.h>
int main(void)
{
	int i;
	int array[10];
	int *p;
	for(i=0;i<5;i++)
	{
		array[i]=i;  //循环赋值 
	}
	for(i=0;i<5;i++)
	{
		printf("array[%d]is%d\n",i,array[i]);   		//循环打印array数组 
	}
	for(i=0;i<5;i++){
		printf("&array[%d] addr is%p\n",i,&array[i]); //打印array[i] 直接取地址 
	}
	printf("\t\n"); 
	for(i=0;i<5;i++){
		printf("&array[%d] addr is%p\n",i,(void*)&array[i]); //array[i] 按照printf%p输出格式输出地址 
	}
	printf("指针输出方式\n");
	printf("\t\n");
	p = array;
	for(i=0;i<5;i++)
	{
		printf("*p is %d \t,&p addr is %p\n",*(p+i),(void *)(p+i)); //指针方式输出数组值和地址 
	}
	printf("\t\n");
		for(i=0;i<5;i++)
	{
		printf("*p is %d \t,&p addr is %p\n",p[i],(void *)&p[i]); //指针方式输出数组值和地址  
	}
	return 0;
}

令人头痛的*,它是啥

*是间接运算符,有的书也称为解析运算符,为单目运算符。在指针前面加上它,就可以表示指针指向的变量。它的对头&运算符是取地址运算符。

  • 对变量使用&,就是获得变量的地址。int a;&a
  • 指针变量保存 &获得的变量的地址给自己。int *p = &a;
    -对指针使用*可以解析指针地址所指向的变量,即指针指向的值。

*是乘法运算符,也称为后置运算符,是双目运算符。 2*3

指针运算

C语言较其他语言比较罕见的功能就是指针运算。
指针运算

  • 对指针进行整数加减运算
  • 指针之间的加减运算功能

C标准对指针的加减运算,只允许指针指向 数组元素,或超过 数据末尾1个元素的位置,且加减运算结果也指向 数组元素,或超过数组末尾1个元素的位置。
C语言,对指针加1后,其地址就增加该指针所指向的类型的长度
指针加n,其地址增加指针指向的类型长度*n

空指针(Null pointer)与空字符(Null character)

定义
空指针是一个特殊的指针值,其指针值通常是NULL,它是一个保证不指向任何地址的指针
因空指针与任何非空指针进行比较都不相等,常用作返回指针的函数发生异常时的返回值使用。所以每次用NULL初始化指针,那么在误用无效的指针时,就能够立刻发现BUG。
#define NULL ((void*)0) 正确的使用空指针的操作系统
但在大多数系统中,经常把0地址作为NULL。

#difine NULL 0  //有些允许环境stdio.h里

所以就在系统中,int *p=0;把p指针设置为空指针,这种操作能被系统允许。

常见错误:字符串时以空字符’\0’结尾,而不是空指针结尾。

C语言标准对空字符的定义
所有位均为0的字节称为空字符(Null character),空字符是值为0的char类型。

总结

NULL 表示空指针
‘\0’ 表示空字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值