马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
指针4
指针表达式
一个表达式的最后结果如果是一个指针,那么这个表达式就叫指针表达式。下面是一些指针表达式的例子。
int a,b;
int array[10];
int *pa;
pa = &a; //&a是一个指针表达式
int **ptr = &pa; //&pa也是指针表达式
*ptr = &b; //*ptr和&b都是指针表达式
pa = array;
pa++; //这也是指针表达式
char *arr[20];
char **parr = arr; //如果把arr看作指针的话,arr也是指针表达式
char *str;
str = *parr; //*parr是指针表达式
str = *(parr+1); //*(parr+1)是表达式
str = *(parr+2); //*(parr+2)是表达式
由于指针表达式的结果是一个指针,因此指针表达式也具有指针所具有的4个要素,即指针的类型、指针所指向的类型、指针指向的内存区、指针自身占据的内存。
当一个指针表达式的结果指针已经明确地具有了指针自身占据地内存时,这个指针表达式就是一个左值,否则就不是一个左值。
综合应用——使用指针进行排序
例题:输入3个不同地整数,存储在变量a、b和c中,使用指针交换,按照从大到小地顺序排序,并输出。
#include <stdio.h>
int main()
{
int a, b, c;
int *p1 = &a, *p2 = &b, *p3 = &c, *p; //声明3个指针变量
printf("请输入变量a, b, c\n"); //输入a和b的值
scanf("%d %d %d",&a, &b, &c);
if(*p1 < *p2) //当*p1小于*p2时交换
{
p = p1;
p1 = p2;
p2 = p;
}
if(*p1 < *p3)
{
p = p1;
p1 = p3;
p3 = p;
}
if(*p2 < *p3)
{
p = p2;
p2 = p3;
p3 = p;
}
printf("变量a的值是%d, b的值是%d,c的值%d\n", a, b, c);
printf("变量*p1的值是%d, *p2的值是%d,*p3的值%d\n", *p1, *p2, *p3);
return 0;
}
例题分析:
计算机内存中的每个内存都由一个地址标识。通常,邻近的内存位置合成一组,这就是允许存储更大范围的值。指针的值表示内存地址。
指针变量的值并非它所指向的存储位置的值。我们必须使用间接访问来获得它所只想位置存储的值。对一个”指向整形的指针“施加间接访问的结果将是一个整型值。
声明一个指针变量并不会自动分配任何内存。在对指针执行间接访问前,指针必须及逆行初始化,或者使它指向现有的内存,或者给它分配动态内存。对未初始化的指针变量执行间接访问操作是非法的,而且这种错误常常难以检测。其结果常常是一个不相关的值被修改。
|