一.基础知识点
1.?取地址运算符&:可获得变量的地址;
2.输出格式符%p:表示输出变量的地址值;
3.变量在内存中所占存储空间的首地址,称为该变量的地址; 而变量在存储空间中存放的数据,称为变量的值。
二.指针
1.变量i的地址:&i
2.将i的地址存入一个指针变量p中p = &i(可以存储地址的变量称为指针变量。)
3.定义:基类型关键字 (指针变量所指向的变量的类型)? ? ? ? ? ?*(*为指针声明符)指针变量名
举例: int *pa ;//pa是整型指针,它指向一个整型变量;
char *pc ; //pc是字符型指针,它指向一个字符型变量;
double *pd1 , *pd2 ;
或: int* pa ;//定义指针变量pa,它指向一个整型变量。
int* pd1 , pd2 ; //pd1是一个指向int类型的指针,而pd2是一个int类型的变量
4.赋值:p = &i;//p指向变量i的地址(这是指针最常用的赋值方法)
?p = 0 ;//常量NULL在系统文件stdio.h中被定义
p = NULL;//其值为0,将它赋给指针时代表空指针
相同类型的指针才能相互赋值
5.概念辨析:指针变量也是一个变量,只不过该变量中存储的是另一个对象的内存地址;
如果一个变量存储另一个对象的地址,则称该变量指向这个对象;
例:
???????int *p1 = &a ;
定义了一个指针p1并将a的地址给了p1?
例:
void swap1(int x, int y)
{
int t;
t = x; x = y; y = t;//不能实现a,b的互换,因为无return什么的输出
}
int main()
{
a = 3, b = 5;
swap1( a, b );
printf("%d %d\n",a,b);
return 0;
}
//函数swap1的参数x和y是按值传递的。这意味着函数swap1中的操作只会影响到传递给它的副本,而不会影响到main函数中的变量a和b。因此,即使在swap1函数中交换了x和y的值,这不会影响main函数中的a和b。?
正确的版本:
void swap2(int *x, int *y)
{
int t;
t = *x;
*x = *y;
*y = t;
}
int main()
{
int a = 3, b = 5;
swap2(&a, &b);
printf("%d %d\n", a, b);
return 0;
}
*x=什么,*y=什么相当于又将 其重新赋值了一遍
三.例题
1.对于定义int a[10],*p=a;
语句p=a+1;
和a=a+1;
都是合法的。
解析:语句p=a+1;是合法的,因为它将指针p指向数组a的下一个元素。
a=a+1;是不合法的,因为数组名a是一个常量指针,不能被重新赋值。
2.调用printf函数,%s的格式输出字符串时,字符数组名、字符指针和字符串常量都可以作为输出参数。
3.
若p1、p2都是整型指针,p1已经指向变量x,要使p2也指向x, __A__是正确的。
A.p2=p1
B.p2=**p1
C.p2=&p1
D.p2=*p1
p1已经指向变量x:p1=&x
A.将p1的值赋给p2可以使它们都指向同一个变量x
B.
C.&p1表示p1的地址,而不是p1所指向的变量的地址
D.*p1表示p1所指向的变量的值,而不是p1所指向的变量的地址。
4.
根据声明int a[10], *p=a;
?,下列表达式错误的是(C )。
A.a[9]
B.p[5]? ??
C.a++
D.*p++
B.p[5]表示指针p所指向的内存位置往后偏移5个位置处的值。在给定的声明int a[10],?p=a;的情况下,p[5]将等同于(p+5),它将指向数组a中的第6个元素的值。
5.在基类型相同的两个指针变量之间,不能进行的运算是( )。
A.<? ? ? ?B.=? ? ? C.+? ? ? ?D.–
不可以进行:
加法运算,这是由于指针相加没有任何意义,反而可能产生越界内存问题。
可以进行:
(1)比较大小:可以用来判断指针位置的高低。
(2)赋值运算:类型相同的指针之间可以进行赋值运算。
(3)减法运算:两个指针相减是获取之间元素的个数