指针操作数组
int arr[]={1,2,3,4,5,6,7};
//数组名是一个常量 不允许赋值`
//数组名是数组首元素地址
//arr=100; err
int* p;
p=arr;
printf("%p\n",p);
printf("%p\n",arr);
//输出的地址相同
for(int i=0;i<size;i++)
{
printf("%d\n",*(arr+i))
//arr为地址 *(arr+i)=arr[i]
//p=arr 则可写成*(p+i)=p[i]
}
以上区别:指针p是变量,4个字节大小
数组arr是常量,40(4×10)个字节大小
指针运算
注意:指针运算不是简单的整数运算
指针类型+1 等同 内存地址+sizeof(指针类型)
void strcpy(char* dest,char* ch)
{
while(*(ch+i))
//即while(*(ch+i)!='\0') 判断为真则进入循环
{
*(dest+i)=*(ch+i);
i++;
//可写为:
//*dest=*ch;
//dest++,ch++;
}
*(dest+i)=0;
//*dest=0;
}
int main()
{
char ch[]={"hello word"};
char dest[];
strcpy(dest,ch)
}
void strcpy(char* dest,char* ch)
{
while(*dest++ = *ch++)
//先赋值,再判断
}
指针运算符操作中:
指针+指针,指针×指针,指针×数字 都没有意义。
指针数组
数组的每个元素都是指针类型的数组。
1,定义:
数据类型 数据名[]={值1,值2,...,值3}
int a=10, b=20, c=30;
int* arr[3]={&a,&b,&c};
//arr[0] arr[1] arr[2]都是地址
printf("%d\n",*arr[0]);
//打印出10
指针数组大小:数据类型×4
2,用指针数组存储指针
int a[]={1,2,3};
int b[]={4,5,6};
int c[]={7,8,9};
int* arr[]={&a,&b,&c}
//arr[0]=a
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
printf("%d",arr[i][j]); //等价*(*(arr+i)+j)
多级指针
二级指针就是指向一个一级指针变量地址的指针。若p为二级指针,则*p为一级指针。
*的作用为降级
int* arr[&a,&b,&c];
int** p=arr;
printf("%d\n",**p); //对应arr[0][0]
printf("%d\n",**(p+1));//对应arr[1][0]
//二级指针加偏移 相当于跳过了一个一维数组大小
printf("%d\n",*(*p+1))//对应arr[0][1]
//一级指针加偏移量 相当于跳过了一个元素
printf("%d\n",*(*(p+1)+1))
//先二级指针p加偏移量,跳过一个一维数组
//再一级指针*(p+1)加偏移量,跳过一个元素
//对应arr[1][1]
for(int i=0;i<3;i++)
for(int j=0;j<3,j++)
printf("%d\n",p[i][j]);
//等价*(p[i]+j)=*(*(p+i)+j)
pp是二级指针的值 pp=&p
*pp是一级指针的值 *pp=p=&a
**pp是变量的值 **pp=*p=a=10
int a=10;
int b=20;
int* p=&a;
int** pp=&p;
**pp=100; //改变的是**pp=*p=a中的10变为100
*pp=&b; //改变的是*pp=p中存储的&a变为&b