C语言指针基本操作
指针
指针介绍
如果说C语言最有魅力的地方在哪,那么毋庸置疑,非指针
莫属了。
众所周知,C语言中每个变量都有一个内存地址,可以通过&
进行访问。指针是一个变量,它的值是一个变量的内存地址
【注意是内存地址
】。
指针表达式:
type *var-name;
//其中type代表C语言的数据类型,例如:int,double,char,float
指针
- 指针声明
指针进行声明时,
=
的右边必须为内存地址,不可以是变量(但是int*p=0;
除外,该语句表示指针为空) - 指针初始化
在初始化指针的时候,如果暂时不需要赋值,可以将值赋值为NULL,可称为
空指针
。ps: *不赋值NULL也行,不过赋值NULL是一种好习惯,但是如果定义指针数组,大可不必这样。
指针最基本使用
首先先介绍一下指针最基本最基本的使用
#include <stdio.h>
void main(){
int a = 10;
int *p =NULL; //如果将其写成 int *p = 10;那么程序肯定会报错,但是如果写成 int *p = 0,不会报错
printf("指针赋值前的地址:%p\n",p);
printf("变量a的地址:%p\n",&a);
p = &a;//将变量a地址赋值给指针
printf("指针赋值后的地址:%p\n",p);
printf("指针访问值:%d\n",*p);
}
输出结果是:
指针赋值前的地址:(nil)
变量a的地址:0x7ffef9a9655c
指针赋值后的地址:0x7ffef9a9655c
指针访问值:10
ps:(nil)
就代表空的意思,不同的编译器显示不同。
解释一下原理
可以简单的理解为:
如果在*p
中,p
代表一个内存地址,而这个内存地址中储存了一个值,那么使用*
可以将这个值取出来,则*p
就代表这个内存地址中的值。
例如:
#include <stdio.h>
void main(){
int a = 10;
printf("结果是:%d",*(&a));
}
运行结果:
结果是:10
指针的基本应用
指针与数组不可说的秘密
简单点来说,指针跟数组没有半毛钱关系。只是说,经常将指针和数组拿过来共同使用,于是乎,两者便有了点关系。
指针数组
指针数组定义与数组定义类似
int a[10];//定义一个数组
int *p[10];//定义一个指针数组
使用案例:
#include <stdio.h>
void main()
{
int a[] = {10,20,30};
int *p[3]; //此时不要写成 int *p[3] =NULL;
for(int i =0;i<3;i++){
p[i] = &a[i]; //对指针数组元素进行赋值
}
for(int j=0;j<3;j++){
printf("第%d个值是%d\n",j,*p[j]);
}
}
运行结果:
第0个值是10
第1个值是20
第2个值是30
指针与数组
- 首先先说一下指针运算
指针运算有点奇葩,和平常的有点不一样。假设
ptr
是一个指向int
32位整数类型的指针,所指的地址是100
,那么执行ptr++
所得到结果是ptr将指向104
对指针进行自加自减的操作,所加或者所减的值会根据数据类型而不同
,可知,char
类型的指针自加自减的值为1
- 指针指向数组
int var[]={10,20,30}; int *p = NULL; //将p指向数组的首个元素地址 p = var; //等价于 p = &var[0];
- 指针和数组
#include <stdio.h> void main(){ int var[] = {10,20,30}; int *p; p = var; //也可写做 p = &var[0]; for(int i = 0;i<3;i++){ printf("p所指向的地址:%p\n",p); printf("p所指向的值:%d\n",*p); p++; } }
运行结果
p所指向的地址:0x7fff9aa44a2c p所指向的值:10 p所指向的地址:0x7fff9aa44a30 p所指向的值:20 p所指向的地址:0x7fff9aa44a34 p所指向的值:30
emm,简单的指针的使用就介绍到这里了,在下一篇中,我将会再介绍一下指针的其他操作
原文地址:https://www.cnblogs.com/xiaohuiduan/p/9865126.html
时间: 2024-10-14 02:36:46