指针的使用
-
int *pointer_1 定义整型指针变量 pointer_1
-
pointer _1 =&a 指针变量 取到(指向)a的地址
-
printf(“%d”,pointer _1) 里面的pointe_1为取 pointer_1指向地址中的值 变量a
-
&pointer_1 自右向左结合 第一步pointer_1指向变量a 相当于 &a a的地址
-
*&a 自右向左结合 第一步&a 取a的地址 *地址 就是变量a的值
a= *&a= *pointer_1 -
*和++ 同一优先级别 自右向左 (*pointer_1)++ = a++ 不加括号 * pointer_1++ = *(pointer_1++)
-
指向多维数组元素的指针变量
int (*p)【4】表示p是一个指针变量,它指向包含4个元素的一维数组
如果指向第一个一维数组a【0】其值等于a,a【0】或者&a【0】【0】
p+i指向一维数组a【i】
*(p+i)+j 是二维数组i行j列元素的地址 *(p+i) 表示地址的值
((p+i)+j) 是二维数组i行j列元素的值 -
内存分区问题 堆、栈、自由存储区、全局/静态存储区和常量存储区 5大内存分区 *a=“hello” a为内存中的常量区 一般不可以修改
-
字符指针作为函数参数
copy函数为例
void copy_string(char *from,char *to)
{
while( (*to = *from) != ‘\0’ )
{
to++;
from++;
}
}
其中函数体内可以修改
while( (*to++ = *from++) != ‘\0’)
{
;
}先执行*to =*from 再执行 to++,from++
还可以修改为
while( *from != ‘\0’ )
{
*to++ = *from++;
}
*to = ‘\0’;
或者
while( *to++ = *from++ )
{
; // ‘\0’ == 0
}
因为 字符串结束标志’\0’等于ASSCLL的0
或者用for
for( ; *to++ = *from++; )
{
;
}
也可以将函数的形参变为数组
void copy_string(char from[],char to[])
{
char *p1,*p2;
p1=from;
p2=to;
while( (*p2++ = *p1++) != ‘\0’ )
{
;
}
}
这种方法比较多余 -
字符串指针变量和字符串数组的讨论
1.字符串数组放的是字符,字符串指针放的是地址(字符串第一个字符的地址)
2.字符数组只能对各个元素赋值不能
char str[20];
str=“I like swimming !”;
应该是char str[20]={I like swimming !};
字符指针变量可以
char *a;
a=" I like swimming !";
注意赋给a的不是字符 而是字符串第一个元素的地址(内存中的常量区,把首地址给a)
3.赋初值
字符指针变量赋初值
char *a=" I like swimming !";
等价于
char *a;
a=" I like swimming !";
但是对数组的初始化
char str[20]={I like swimming !};
不能等价于
char str[20];
str[]=“I like swimming !”;
4.定义了一个字符数组,在编译时为它分配内存单元,有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址让它指向一个字符型数据,但是如果未对它赋予一个地址值,则它没有具体指向一个确定的字符数据
例如对一个没有赋初值的指针变量a
char *a;
scanf("%s",a);
a是随机指向的
5.指针变量的值可以改变
char *a=“I like swimming !”
cout<<a<<endl;
a+=7;//地址加7指向第7个数据
cout<<a;
结果是
I like swimming !
swimming !
另外需要说明:定义一个指针变量,并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符
char *a=“I like swimming !”
int i;
cout<<“The sixth character is << a[5];
结果是The sixth character is e
printf中 字符串是%s 字符是%c
for( i=0; a[i] != ‘\0’; i++ )
{
printf(”%c", a[i]);
}
-
避免嵌套注释
开
#if(1)
…
#endif
关(不执行)
#if(0)
…
#endif -
指向函数的指针
——————f1 ————f2
void sub(int (*x1)(int), int (*x2)(int,int))
{
int a,b,i,j;
a=(*x1) (i); //调用 函数f1
b=(*x2) (i,j); //调用 函数f2
…
}
sub函数中定义俩个形参 x1,x2为指向函数的指针变量。在调用sub函数时,实参为俩个函数名f1,f2,给形参传递的是函数f1,f2的地址
void process( int, int, int(*fun)() );
process(a, b, max);
process(a, b, min);
process函数可以指向其他函数由一个函数实现其他函数 类似多态
例:double *search(double(*pointer)[4], int n);
指向函数的指针search 形参是指向多维数组的指针pointer指向包含4个元素的一维数组,和标志数组位置的形参n -
printf%5.2f的含义
输出5位有效数值,其中2位小数,小数点也算一位
例 12.428 —12.43 // 12.4----12.40 // 1.4— 1.40 注意1前有一个空格 -
指针函数,函数指针
前者是函数,带有指针的函数 后者是指针,指向函数的指针 -
指针数组,指向指针的指针
1.指针数组的概念:一个数组 其元素均为指针类型数据 例 int *a[4] 表示数组a中有4个指针
int a[5] = {1, 3, 5, 7, 9};
int *name[5] = {&a[0], &a[1], &a[2], &a[3], &a[4]};
2.指向指针的指针 char **p
星号运算的结合性是从右到左,因此相当于 *(*p) 指针变量p 指向字符指针变量 *p就是p指向的另一个指针变量