✨博文作者:烟雨孤舟
喜欢的可以 点赞 收藏 关注哦~~✍️ 作者简介: 一个热爱大数据的学习者
✍️ 笔记简介:作为大数据爱好者,以下是个人总结的学习笔记,如有错误,请多多指教!
目录
简介
指针变量的定义
指针变量初始化
指针变量的引用
指针的基本运算
指针的算术运算
指针和函数
指针和数组
指针和字符串
每一个变量都有一个内存位置。指针就是变量的内存地址,指针变量是用来存放内存地址的变量,就像其他变量一样,在使用指针存储其他变量地址之前,要对其进行声明。指针变量的值是个地址,这个地址不仅可以是变量的地址也可以是其他数据结构的地址(数组、函数等)。为了表示指针变量和它所指向的变量之间的关系,在程序使用 *表示指向
变量或程序代码在程序运行时会被以字节为单元存储在存储器中,程序会根据变量类型分配相应大小的内存单元,内存单元分为内存内容与内存地址,内存内容一般为变量的实际值,内存地址就是程序分配给变量的地址指针就是用于访问和操作地址的。
指针的大小取决于计算机体系结构和操作系统的位数。在32位操作系统中,指针通常为4字节;在64位操作系统中,指针通常为8字节。
指针就是内存地址,指针变量是用来存放内存地址的。
指针变量声明的一般形式为:
type *var_name;
类型标识符 *变量名;
int a=3;
int *ip; /* 声明一个整型的指针 */
ip =&a; //将a的地址赋值给ip;*ip的值就是a的值
定义指针和使用指针是*的意义不同,int *a=&b;表示为指针变量a指向b的地址,即a=&b而不是*a=&b,*a为b的值。在指针变量定义或初始化时变量名之前的*只表示该该变量是一个指针变量,引用指针变量是*则表示间接访问。
指针变量的定义:
指针变量的类型决定了它所能指向的变量的类型
指针变量并不固定指向一个变量,可指向同类型的不同变量。
指针变量定义后,变量值不能确定,应用前必须先赋值。
指针变量只能存放地址,不能将一个非地址类型的数据(如常量值)赋给一个指针变量,但0(NULL)除外
两个指针运算符:& *
&:取变量的地址
*:取指针所指向的内容
一般形式:
数据类型 *指针名 =初始地址值;
例如:
int i;
int*p=&i;
//指针变量只能指向定义时所规定的变量
int i, *p=&i;
//指针变量和指向定义时所规定类型的变量同时定义
int i, *p=&i;
int *q=p;
//用已初始化的指针变量作为初始值
定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。指针的类型必须与它所指变量的类型相同。
两个有关的运算符:
&:取地址运算符。
*:指针运算符或称“间接访问”运算符,访问指针变量所指向的对象。
需要注意的是指针运算符*和指针变量说明中的指针说明符*不是一回事。在指针变量说明中,“*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*”则是一个运算符,用以表示指针变量所指的变量。
#include
int main ()
{
int a = 20,int *p; /* 指针变量的声明 */
p = &a; /*将var的地址赋值给指针ip*/
printf("a 变量的地址: %p\n", &var );
/* 在指针变量中存储的地址 */
printf("ip 变量存储的地址: %p\n", p );
printf("*p 变量的值: %d\n", *p );/* 使用指针间接访问值 */
printf("a 变量的值: %d\n", a );/* 直接访问值 */
return 0;
}
//a 变量的地址: 0x7ffeeef168d8
//p 变量存储的地址: 0x7ffeeef168d8
//*p 变量的值: 20
//a 变量的值:20
1.取地址运算和间接访问运算
int *p,a=3;
p = &a;
//将整型变量a的地址赋值给整型指针p,p的值就是a的地址,*p的值就是a的值
2.赋值运算符
int a=3,*p1,*p2;
p1=&a;
p2=p1;
//a的地址赋值给p1,p1的值为a的地址,把p1的值赋值给p2,p2的值为a的地址,*p1和*p2的值为a的值3.
赋值运算:
int a=3; int *p=&a;
//把变量的地址赋予指向的相同数据类型的指针变量
int a=3;int *p; p=&a;
//把变量a的值赋予给相同类型的指针变量
int a=3,*p=&a,*q; q=p;
//将指针变量p的值赋值给q,p=a=q=3
int a[5],*p=a;
//将数组的首地址赋予指针变量
char *p="hellp";//把字符串的首地址赋予给指定字符类型的指针变量
C语言支持3种格式的指针算术运算,包括指针加上整数,指针减去整数和两个指针相减。
加减运算:
对于指向数组的指针变量,可以加上或减去一个数n,即将指针指向的位置前移或者后移n个单位
int a[5],*p;
p=a; //指向a0,数组名就是数组首个元素的地址
p=p+1//指向a1
指针相减:
两个指针相减,得到的是指针之间元素的个数。若指针p指向a[i],指针q指向a[j],则p-q等于i-j
C 指针是一个用数值表示的地址。可以对指针进行四种算术运算:++、--、+、-。
设ptr是一个指向地址 1000 的整型指针,ptr++执行完运算之后,ptr 将指向位置 1004,因为 ptr 每增加一次,它都将指向下一个整数位置,即当前位置往后移 4 字节
指针的每一次递增,它其实会指向下一个元素的存储单元。
指针的每一次递减,它都会指向前一个元素的存储单元
指针在递增和递减时跳跃的字节数取决于指针所指向变量数据类型长度,比如 int 就是 4 个字节。
*p++或*(p++) 首先计算表达式的值为*p,然后p自增1
(*p)++ 首先计算表达式的值为*p,然后*p自增1
*++p或*(++p) 首先将p自增1,然后计算表达式的值为*p
++*p或++(*p) 首先将(*p)自增1,然后计算表达式的值为(*p)
在一个指针变量中存放一个数组或一个函数的首地址有何意义呢?因为数组或函数都是连续存放的。通过访问指针变量取得了数组或函数的首地址,也就找到了该数组或函数。凡是出现数组、函数的地方都可以用一个指针变量来表示,只要在该指针变量中赋予数组或函数的首地址即可。
在c语言中指针也可以作为函数的参数,如果某个变量的地址作为函数的实参,相应的形参就是指针。
函数实参与形参之间的数据传递是单向的“值传递”方式,调用函数不能改变实参的值,指针变量作为函数参数时也遵守这一个规则。
调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向变量的值,这样的机制被称为引用调用。采用引用调用需要在函数定义时将指针作为函数的形参,在函数调用时把变量的地址作为实参。
如果定义了一个一维数组,系统会默认为数组分配一段连续的内存空间,此时定义一个指针,并把数组的第一个元素的起始地址赋值给该指针,则该指针就指向了这个数组。
当一个指针变量被初始化成数组名时,就说该指针变量指向了数组。
指针:也是一个变量,存储的数据是地址。
数组名:代表的是该数组最开始的一个元素的地址。
指针数组:int *ptr[MAX];
把ptr声明为一个指针数组,由多个整数指针组成。ptr中的每个元素,都是一个指向 int 值的指针。
例如:
int a[2]={1,2};
int *p =a[0];
//将数组元素a[0]的地址赋值给指针p,使p指向数组a的第一个元素
在使用指针数组存放多个相同数据类型的数据并进行运算时数组的长度在定义时必须给定,如果事先不知道数据的数量只能采用估计上限和利用指针实现存储空间的动态分配。
指针引用一维数组元素,可以用以下两种方法:
1.下标法:如a[i]或p[i]形式
2.指针法,如*(a+i)或*(p+i)。其中a是数组名,p是指向数组元素的指针变量,其初始值为p=a,即p的值为数组名(数组首元素的地址)。
指针与数组的区别:
1. 指针和数组保存的数据内容不同.指针保存指针变量,即保存数据的地址;数组保存同一类型数据的值
2. 指针用于动态数据结构,指针保存的数据可以改变;数组用于存储固定数目且数据类型相同的元素,数组的大小定了就不容易变了;
3. 指针用malloc()和free()来分配空间和释放空间,而数组是隐式分配和删除
4. 指针通常指向匿名数据,而数组自身就是数组名
5.作为函数参数时数组名就等于指针
在C语言中,可以用两种方法访问一个字符串:
用字符数组存放一个字符串,然后输出该字符串。
char string[]="IloveChina!";
printf("%s\n",string);
用字符串指针指向一个字符串。
char*string="IloveChina!";
printf("%s\n",string);
字符串的指针表示法:
char *指针名;