其他分享
首页 > 其他分享> > 《TCPL》笔记:指针

《TCPL》笔记:指针

作者:互联网

  1. 指针是一种保存变量地址的变量,是能够存放一个地址的一组存储单元。
  2. p=&c;
    &只能应用于内存中的对象(变量和数组),不能作用于表达式、常量或register类型的变量
  3. 运算符优先级:
    .-> 结合方向:从左到右
    ②++ * 结合方向: ++为前缀时,从右到左;++为后缀时,从左向右
    例如:
    1.p++和(p++)相同:先读取*p,然后返回值,再给p加1
    2.(*p)++: 先读取 p,然后返回值,再给 p的值加1
    3.
    *++p和
    (++p)相同:先给p加1,然后读取
    p,再返回值
    4. ++p和++(p)相同:先读取p,然后给p的值加1,再返回值
    4.指针与函数:
void swap(int x, int y)
{
	int temp;
	temp=x;
	x=y;
	y=temp;
}
int main()
{
	int a=1;
	int b=2;
	swap(a,b);
}

如果要交换a和b的值,上面的swap函数并不起效果,因为只是对a和b的副本进行交换。
那么如何改进呢?其实只要把swap函数的参数改为指针就行,即:

void swap(int *x, int *y)
{
	int temp;
	temp=*x;
	*x=*y;
	*y=temp;
}
int main()
{
	int a=1;
	int b=2;
	swap(&a,&b);
}

注意func(b,++b);这种沙雕写法
5.字符指针与字符数组

char amessage[] = "now is the time";
char *pmessage = "now is the time";
char *p = &amessage[0];
amessage[1]='A';   // right
*++pmessage='A';   //wrong
*++p ='A';        //right

amessage是一个一维数组,可对单个字符进行修改,但始终指向同一个存储位置
pmessage是一个指针,其初值指向一个字符串常量,如果试图修改字符串的内容,结果是没有定义,但它可以指向其他地址
p是一个指针,它指向amessage的存储地址,所以可以修改字符串中的内容

void strcpy(char *s,char *t)
{
	while((*s++==*t++)!='\0')
		;
}

strcpy函数的功能是吧字符串t的内容复制给字符串s,实现这个函数的时候不能直接s=t,否则只是拷贝了指针,让s和t指向的存储地址相同

6.多维数组
如果想要用数组做一个记录每月天数的表,一维的数组是不够用的,因为有闰年和非闰年,两者每个月的天数不同,所以将这些天数存放再一个二维数组会好的多。
二维数组的声明:

static cha daytab[2][13]={
	  {0,31,28,31,30,31,30,31,31,30,31,30,31},
	  {0,31,29,31,30,31,30,31,31,30,31,30,31}
};

如果将二维数组作为参数传递给函数,那么在函数的参数声明中必须指明二维数组的列数,而和数组的行数没有太大关系,因为函数调用时传递的是一个指针,它指向由行向量构成的一维数组。
例如将daytab作为参数传递给函数f:

//以下声明都是正确的
f(int daytab[2][13]){...}
f(int daytab[][13]){...}
f(int (*daytab)[13]){...}

标签:++,31,30,笔记,TCPL,int,数组,指针
来源: https://blog.csdn.net/birdaaron/article/details/88370330