虽然现在工作使用的是java编程语言,但是学过C语言的都知道java的许多语言特性从C的高级版本C++那里进行沿用和发展。那两者之间到底有何区别呢?
指针是c语言最大的优点,它可以使用户几乎可以访问计算机的所有内存资源和其他部分资源(就是指那里打拿里)。JAVA语言让编程者无法找到指针来直接访问内存无指针,并且增添了自动的内存管理功能,从而有效地防止了C语言中指针操作失误造成的系统崩溃。但也不是说JAVA没有指针,虚拟机内部还是使用了指针,只是外人不得使用而已。这有利于Java程序的安全。
前面说到这么多,到底指针是个什么东西?
指针是C语言中的一种数据类型,存放的是数据的内存单元地址。
计算机系统的内存拥有大量的存储单元(每个存储单元的大小为1字节),为了便于管理,必须为每个存储单元编号,改编号就是存储单元的“地址”。每个存储单元拥有一个唯一的地址。
指针变量除了可以存放变量的地址外,还可以存放其他数据的地址,例如可以存放数组和函数的地址。
指针的定义格式:
数据类型 *指针变量名;
指针的初始化:
指针变量名=初始化地址值
说明:
-
" * "
表示定义的是一个指针变量。指针变量的前面必须有" * "
。 -
"初始值地址"
一般都是&变量名称
、&数组变量名称
、&数组元素
,注意:这些变量名称必须要是已经定义过的,定义过了之后才能使用。 -
数据类型符
指的是定义的指针变量所指向的变量的数据类型,可以是任何基本数据类型,也可以是其他数据类型。 - 在定义指针变量的同时也可以定义其他的普通的变量或数组等。
举个栗子:
#inlude<stdio.h>
void main()
{
int a,*p;
a=10;
p=&a;
printf("p=%d\n",*p);
}
- 定义指针变量的时候,可以只给部分的指针变量赋初始值。
- 指针变量的初始化,除了可以是已定义变量的地址,也可以是已初始化的同类型的指针变量,也可以是NULL(空指针,C中对于NULL大小写敏感,null和NULL不一样)。
#include<stdio.h>
void main()
{
int a=10,*p=NULL;
p=&a;
printf("p=%d\n",*p);
}
- 指针变量初始化的时候,指针变量的
“数据类型符号”
必须与其“初始地址值”
中保存的数据的类型相同。
-
指针运算符
*
指针运算符“ * ”
的作用是取指针变量所指向的地址中的内容,与地址运算符“ & ”
是相逆的,它是单目运算符号。指针运算符的作用对象必须是地址
,可以是已赋值的指针变量,也可以是变量或数组元素的地址。
eg1:
#include<stdio.h>
void main()
{
int a=10,*p;
p=&a;
//输出的是指针p所指向的变量的地址
printf("p=%d\n",p);
//输出的是指针p所指向的变量的内容
printf("p=%d\n",*p);
}
//打印结果
p=1703724
p=10
Press any key to continue
- 指针运算符
*
取地址运算符“ & ”
的作用就是取变量的地址,是单目运算符。其作用对象为已经定义的变量或数组元素,但是不能为数组名(int *p,a[10];p=&a
这种形式是错误的,可以将p=&a修改为p=&a[1]
的形式)。取地址运算符的运算结果是得到一个变量的地址。
#include<stdio.h>
void main()
{
int a[]={1,2,3},*p;
//打印a[0]的地址
printf("a[0] address=%d\n",&a[0]);
//将a[0]的地址赋值给p
p=&a[0];
//打印p指针变量的内容
printf("p=%d\n",*p);
//打印p指针变量此时所指向的地址,应该和前面a[0]的地址一致
printf("p=%d\n",p);
}
//打印结果:
a[0] address=1703716
p=1
p=1703716
Press any key to continue