指针:是一个存储计算机内存地址的变量
指针取值:从指针指向的内存读取数据
操作符 * :既可以用来声明一个指针变量,亦可用作指针的取值。当用在声明一个变量时,*表示这声明了一个指针。其他情况用到*表示指针的取值。
地址操作符 & :用来引用一个内存地址。通过在变量名字前使用&操作符,可得到该变量的内存地址
//声明一个int指针
int * p;
//声明一个int值
int val = 20;
//为指针分配一个int值的引用
p = & val;
//对指针取值
int i = *p;
printf("%d\n",i);
对指针变量赋值时需要注意:
(1)指针变量中只能存放地址。不要将一个数值赋给一个指针变量,如 int *ipPointer = 10,编译将出错。(2)赋给指针变量的变量地址类型要与定义指针变量的类型一致。
int iValue = 5;
float *ipPointer;
ipPointer = &iValue;//非法。有的编译器报错,有的没有
指针变量作为函数参数:
(1)作用是将一个变量的地址传递给另一个函数参数
(2)若函数形参是指针时,函数实参要么是指向变量的指针,要么是变量的地址。
void F(int *pointer1, int *pointer2)
{
...
}
1)F(&A,&B);
2)
int * P, *Q;
int p = 1,q = 2;
P = &p;
Q = &q;
F(P,Q);//F(p,q)是错误的
指针与数组
在C语言中,数组名代表数组中首元素的地址。
int array[100];
int *point;
point = array;
point = array[0];
point = array与point = array[0]等价。
指针与多维数组
#include <stdio.h>
int main()
{
int a[3][4] =
{
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
int *p = NULL;
p = a;
printf("a=%d\n",*p);
p = a[0];
printf("a[0]=%d\n",*p);
p = &a[0];
printf("&a[0]=%d\n",*p);
p = &a[0][0];
printf("&a[0][0]=%d\n",*p);
p = a[1];
printf("a[1]=%d\n",*p);
p = a[2];
printf("a[2]=%d\n",*p);
p = &a[0]+1;
printf("&a[0]+1=%d\n",*p);
p = a[0]+1;
printf("a[0]+1=%d\n",*p);
printf("&a[0]+1=%d\n",&a[0]+1);
printf("a[0]+1=%d\n",a[0]+1);
p = a+1;
printf("a+1=%d\n",*p);
return 0;
}
在C程序中,可以用两种方法访问一个字符串
(1)用字符数组存放一个字符串
(2)用字符指针指向一个字符串
#include <stdio.h>
int main()
{
char str[] = "Hello!";
char *p = "Hi!";
printf("%s\n",str);
printf("%s\n",p);
return 0;
}
指针与常量
int a = 7;
int b = 8;
const int ci1 = 2;//常量
int const ci2 = 2;//常量
const int *i1 = &a;//指向常量的非常量指针,即指针变量可以赋值为任意int型,但不能通过*i1来修改所指向的值
int *const i2 = &a;//指向非常量的常量指针,即指针变量不能修改,指针所指向的内容可以任意int值
int *i3 = &b;//指向非常量的非常量指针,即常用指针
const int *const i5 = &a;//指向常量的常量指针