指针(2)
1. 对“&”和“*”运算符说明
如果已执行了语句 pointer_1=&a;
(1)&* pointer_1的含义是什么?
“&”和“”两个运算符的优先级别相同,但按自右而左方向结合。
因此先进行 pointer_1的运算,它就是变量a,再执行&运算。
因此,&* pointer_1与&a相同,即指向变量a的地址。
如果有:pointer_2 =&* pointer_1;
。它的作用是将&a(a的地址)赋给pointer_2 ,如果 pointer_2 原来指向b,经过重新赋值后它已不再指向b了,而指向了a。
(2)*&a的含义是什么?
先进行&a运算,得a的地址,再进行运算。即&a所指向的变量,也就是变量a。
&a和pointer_1的作用是一样的,都是取a的地址它们都等价于变量a。即&a与a等价。
(3)(*pointer_1)++相当于a++?
注意括号是必要的,如果没有括号,就成为了pointer_1++,从附录可知:++和为同一优先级别,而结合方向为自右而左,因此它相当于*(pointer_1++)。
(先加加后取地址)
由于++在pointer_1的右侧,是“后加”,因此先对pointer_1的原值进行*运算,得到a的值,然后使pointer_1的值改变,这样pointer_1不再指向a了。
(4)实例:
先定义指针,然后指向地址
输入a和b,按先后大小输出a和b
#include <stdio.h>
void main()
{
int *p1, *p2, *p, a, b;
scanf("%d %d", &a, &b);
p1 = &a;
p2 = &b;
//先定义指针,然后指向地址
if( a < b)
{
p = p1;
p1 = p2;
p2 = p;
}
//此后,p1指向b的地址, p2指向a的地址
//p存在的意义和tmp一样
printf("a = %d, b = %d\n", a, b);
printf("max = %d, min = %d\n", *p1, *p2);
}
对输入的两个整数按大小顺序输出!这次用函数实现交换功能!
#include <stdio.h>
void main()
{
int a, b;
int *pointer_1, *pointer_2;
scanf("%d %d", &a, &b);
pointer_1 = &a;
pointer_2 = &b;
if(a < b)
{
swap(pointer_1, pointer_2); //swap实现的是交换
}
printf("\n%d > %d\n", a, b);
}
void swap(int *p1, int *p2)
{
int temp;
printf("I'm swapping……\n");
printf("Please wait^_^");
temp = *p1; //temp = a;
//p1指针指的是&a的地址(传进来的参数是pointer_1)
*p1 = *p2; //a = b;
*p2 = temp; //b = temp;
}
输入a、b、c 3个整数,按大小顺序输出
#include <stdio.h>
void main()
{
void exchange(int *q1, int *q2, int *q3);
int a, b, c, *p1, *p2, *p3;
scanf("%d %d %d", &a, &b, &c);
p1 = &a;
p2 = &b;
p3 = &c;
//swap(q1,q2);放这里会报错,因为swap定义在exchange里,这里没定义。
//用extend声明一下就可以了,证明在类内声明过了
exchange(p1, p2, p3); //确保a > b > c
printf("%d %d %d\n", a, b, c);
}
void exchange(int *q1, int *q2, int *q3) //int *q1 = p1;
{
void swap(int *pt1, int *pt2); //用于交换&……&%
if( *q1 < *q2 )
{
swap(q1, q2);
}
if( *q1 < *q3 )
{
swap(q1, q3);
}
if( *q2 < *q3 )
{
swap(q2, q3);
}
}
void swap(int *pt1, int *pt2)
{
int temp;
temp = *pt1;
*pt1 = *pt2;
*pt2 = temp;
}
2.数组与指针
一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。
指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。
所谓数组元素的指针就是数组元素的地址。
(1)指向数组元素的指针
定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。
int a[10];//0,1,2,3
(定义a为包含10个整型数据的数组)
int *p;
(定义p为指向整型变量的指针变量)
如果现在要取第三个
p = &a[3]
应当注意,如果数组为int型,则指针变量的基类型亦应为int型。
(2)对指针变量赋值
p=&a[0];
把a[0]元素的地址赋给指针变量p。
也就是使p指向a数组的第0号元素
(3)通过指针引用数组元素
引用一个数组元素,可以用:
(1) 下标法,如a[i]形式;
(2) 指针法,如*(a+i)或*(p+i)。指向第i个元素
其中的a是数组名,p是指向数组元素的指针变量,其初值 p=a。(p=&a[0])
注意:数组名即“翻译成数组的第一个元素的地址!
实例
输出数组中的全部元素
假设有一个a数组,整型,有10个元素。要输出各元素的值有三种方法:
(1) 下标法(下表变量i)
void main()
{
int a[10];
int i;//下标变量
for( i=0; i < 10; i++ )
{
scanf("%d", &a[i]);
}
printf("\n");
for( i=0; i < 10; i++ )
{
printf("%d", a[i]);
}
}
(2) 通过数组名计算数组元素地址,找出元素的值。(*(a+i))
void main()
{
int a[10];
int i;
for( i=0; i < 10; i++ )
{
scanf("%d", &a[i]);
}
printf("\n");
for( i=0; i < 10; i++ )
{
printf("%d", *(a+i));
//*(a+0)就是a[0]的值,如果是int类型相当于加上4个字节就是第一个数
}
}
(3) 用指针变量指向数组元素。(p这个指针指向数组a的首地址)
void main()
{
int a[10];
int i;
int *p;
for( i=0; i < 10; i++ )
{
scanf("%d", &a[i]);
}
printf("\n");
for( p=a; p < (a+10); p++ )
{
printf("%d", *p);
}
}
(4)错误例子
#include <stdio.h>
void main()
{
int *p, i, a[10];
p = a;
for( i=0; i < 10; i++ )
{
scanf("%d", p++);
}
printf("\n");
for( i=0; i < 10; i++, p++ )
{
printf("%d", *p);
}
}
第一个p=a后,指针指向数组第一个元素的位置,经过第一次for循环后,p已经指向数组结尾了,这时如果没有第二个p=a重新把指针指向数组首元素,那么第二个循环里指针指向的位置的值是不确定的
推荐阅读
-
在windows2003sp2或者2008rac环境中,可能会由于默认的SNP(Scal
-
指针(2)
-
Codeforces Round #251 (Div. 2)-C,D_html/css_WEB-ITnose
-
C指针2:指针变量
-
剑指offer59:按之字形顺序打印二叉树:[[1], [3,2], [4,5,6,7]]
-
asp(javascript)全角半角转换代码 dbc2sbc_javascript技巧
-
[Oracle] 分布式事务和两阶段提交(2PC)
-
[转载]——Full UNDO Tablespace In 10gR2 and above (文档 ID 413732.1)
-
如何理解C指针及二级指针(1):二级指针的使用方式
-
关于log4j2的异步日志输出方式