《TCPL》笔记:指针
作者:互联网
- 指针是一种保存变量地址的变量,是能够存放一个地址的一组存储单元。
p=&c;
&只能应用于内存中的对象(变量和数组),不能作用于表达式、常量或register类型的变量- 运算符优先级:
①.-> 结合方向:从左到右
②++ * 结合方向: ++为前缀时,从右到左;++为后缀时,从左向右
例如:
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