指针

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);
}

 

转载于:https://www.cnblogs.com/alon/archive/2009/03/30/1425079.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值