指针
指针:地址,是一种数据类型
概念:为了方便访问内存中的内容,系统给每一个内存单元(字节)一个编号,该编号就是地址,也就是指针
内存大小:4个字节
地址是16进制的无符号整型
*&a//相当于a
&*pa//相当于pa,但根据右结合性,pa必须为指针
int *paa=&arr[0];
int *pab=&arr[3];
cout<<pab-paa<<endl;//3 表明相差3个元素 两个指针可以相减,但不能相加
//相差12个字节,因为类型为int型,所以输出为3
paa++;//正确
arr++;//错误,arr表示数组首地址是常量,不能自增自减
关系运算
p1>p2//表示p1处于高地址位置
const形参和实参
当使用实参初始化形参时,会忽略掉顶层const
void fan(const int i)//fan能读取i,但不能向i写值
//调用fan函数,既可以传入const int 也可以传入 int
-----------------------分割线-------------------------------------------------
int main()
{
int a[4]={1,2,3,4};
int *ptr(int *)(&a+1);
printf("%d",*(ptr-1));//4
//ptr为int型指针 &a为首地址 &a+1表达的是首地址再加上指针类型所占字节数也就是4 所以指向数组尾元素的下一个位置,
//*(ptr-1)也就是a[3]也就是4
}
int *ptr[n]和int (*ptr)[n]区别
1.int( *ptr)[n]:ptr是指向数组的指针,指向的返回类型为int,所以ptr是一个指向整型数组的指针,即数组指针
2.int *ptr[n]:ptr是一个由整型指针的数组组成,数组里面的每一个元素都是整型指针,即指针数组
void* fun(char *arr)
{
char *arr2="world";
arr=arr2;
return arr;
}
int main()
{
char *ch="hello";
fun(ch);
cout<<ch<<endl;
return 0;//hello
}//arr属于形参,属于局部变量,作用只在fun函数内,调用函数后,arr就被释放了,所以实参ch指向仍然不会改变,所以仍然输出hello
int pstr(char str[])
{
return (int)(sizeof(str)-1);
}
void main()
{
char a[20]="hello world";
printf("%d",pstr(a));
}//当函数传递数组指针时,自动退化为指针,而指针长度为4,再减去1,所以输出为3
不能将指针赋值给数组名变量,数组一旦创建之后,数组名一定为该数组首地址,是不变的。