1. 指针变量的引用:
int a, int *point_1;
point_1 = &a;
-------------------
(1). &*point_1
& 和 * 优先级相同,按右向左方向结合,因此先进行*point_t 的运算, 他就是变量a,再执行&运算
因此, &*pointer_1 与 &a相同,即变量a的地址.
(2). *&a
先进行&a,得a的地址,再进行 *运算,即&a所指向的变量. *&a = a;
请注意: 不能企图通过改变指针行参的值而使指针实参的值改变:
swap(int *p1, int *p2)
{
int *p;
p = p1;
p1 = p2;
p2 = p;
}
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);
printf("\n%d,%d\n",*pointer_1,*pointer_2);
}
c语言中参变量之间的数据传递是单向的"值传递"方式 . 指针变量作函数参数也要遵循这一规则.调用函数不可能改变实参指针变量的值,但可以改变实参指针变量所指变量的值.
swap(int *pt1, int *pt2)
{
int temp;
temp = *pt1;
*pt1 = *pt2;
*pt2 = temp;
}
2. strlen 问题
Q.
#include<iostream>
using namespace std;
#include<string>
void main()
{
char *str;
str=new char[10];
cout<<strlen(str)<<endl;
}
请问怎么不是10呢?
A.
申请了10字节内存,但是没有对这些内存进行初始化,这样这些内存的值是随机的,而strlen是取字符串长度,也就是从申请的内存开始处,一直到发现一个内存值为'\0'结束,由于你申请的内存值是随机的,可能都不为0,这样strlen会继续在内存中查找 所以你看到输出10,也可能是其他值
3. 指针和数组
(1)*p++ 由于 ++ 和 *同级,结合方向为自右向左. 因此等价于 *(p++) ,作用是先得到p指向的变量的值(即*p) ,然后再使 p+1 = >p .
列:
for(i =0;i<10;i++,p++)
{
printf("%d",*p);
}
可以改为
for(i=0; i<10;i++)
{
printf("%d",*p++);
}
(2) (*p)++ 表示p所指的元素值加1, 即(a[0])++ ,如a[0]= 3,则(a[0])++ 的值为4
(3) *(p++) 与 *(++p) 作用不同,前者是先取*p值,然后使p加1 ,后者是先使P加1,再取*p, 若p初值为a, 即&a[0] ,输出*(p++)
得a[0]的值, 而输出*(++p)得a[1]的值。
用数组名作为函数参数:
当数组名作为函数参数时,如果形参数组中各元素的值发生变化,实参数组的值随之变化.
将数组n个整数按相反顺序存放
void inv(int x[],int n)
{
int temp,i,j, m = (n-1) /2;
for(i=0;i<=m;i++)
{
j = n-1 - i;
temp = x[i];
x[i] = x[j];
x[j] = temp;
}
return;
}
main()
{
int i,a[10] = {1,2,3,4,5,6,7,8,9,10};
inv(a,10);
}