对指针,数组以及指针和数组的总结

对指针,数组以及指针和数组的总结

一级指针

二级指针

指针和数组

指针数组

首先先谈谈指针

指针(指针变量):指针是一个变量,里面存放的是地址;

(在32位平台下,指针占4个字节;在64位平台下,指针占8个字节;)

指针类型:有字符指针,整形指针,浮点指针,数组指针等

1.指针类型的意义在于进行+1操作时所跳转的步长,整形指针+1,跳转4个字节,字符指针+1,跳转1个字节;

2.指针解引用所访问的权限(是整型还是字符型);

一级指针

代码

int main()
{
    int a[5]={1,2,3,4,5};
    int *p;//*代表p是一个指针,指向int类型
    p=a;
    printf("%p\n",p);
    printf("%p\n",p+1);
    printf("%d\n",*p);
    printf("%d\n",*(p+1));
    return 0;
}

int * 代表定以一个整形指针,变量名为p ,将数组a的首地址赋值给p ,输出 p ,p+1 发现指针加1,跳转的是 4个字节,指针解引用 访问的是数组的第一个元素,+1再解引用,访问的是数组的第二个元素

二级指针

二级指针存放的的一级指针的地址

int a=0;
int *p=&a;//一级指针存放整形a的地址
int **pp=&p;//二级指针,第一个*代表pp是指向int*类型的,第二个*代表pp是指针类型的

代码

int main()
{
	int a = 10;
	int *p=&a;
	int **pp = &p;
	int ***ppp= &pp;
	*p = 10;
	printf("a =%d,*p =%d,%d,%d\n",a, *p, **pp, ***ppp);
	return 0;
}

面运行结果可知,二级指针,三级指针都可以访问变量a

ppp进行 解引用

*ppp=pp; 
*pp=p; 
*p=a ;
***ppp=**pp=*p=a;

二级指针的运用,通常用于指针数组的传参

void fun(char **p)
{

}
int main()
{
	char *p[] = { "abc","bcd","cdf" };
	fun(p);
	return 0;
}

指针和数组

数组:相同类型元素的集合

虽然数组名代表首元素的地址,但是数组名不是指针,数组和指针没关系,虽然在有些些方面,数组和指针在用法上面是一样的;

数组和指针都是单独的类型;

int main()
{
    int a[5]={1,2,3,4,5};
    int *p;//*代表p是一个指针,指向int类型
    int i=0
    p=a;
    for(i=0;i<sizeof(a)/sizeof(a[0]);i++)
    {
    printf("%d  ",a[i]);
    printf("%d  ",*(a+1));  
    printf("%d  ",p[i]);    
    printf("%d  ",*(p+1));
    }
    printf("\n");
    return 0;
}

上面的代码都可以输出数组元素,以上数组和指针用法相似;

说到数值和指针,要考虑数组传参问题

在函数调用时,以数组为参数:

所有的数组在传参的时,都要进行降维(退化,要降维成指向数组内部元素类型的指针;数组传参只有第一个维度可以省略,剩下的都不可以

void fun1(int *arr1,int sz)//arr1指向整形
{   
}
void fun2(int (*arr2)[3],int sz)//arr2 数组指针,指向一个长度为3的一维数组
{
}
void fun3(char **p;int sz)//指向一个char*类型的指针
{
}
int main()
{
    int arr1[5]={1,2,3,4,5};
    int arr2[2][3]={1,2,3,4,5,6};
    char *p[]={"hahaha","wo","li","hai","bu"};//存放的是字符串的首地址
    fun1(arr1,sizeof(arr1)/sizeof(arr1[0]));
    fun2(arr2,sizeof(arr2)/sizeof(arr2[0]));
    fun3(p,sizeof(p)/sizeof(p[0]));
    return 0;
}

数组名其实代表的是数组首元素的地址,但其实数组名是一个指针常量,不可以被修改

**上面有一个数组 p,由“*“修饰,这个数组是指针数组 **

指针数组

首先,指针数组是一个数组,里面存放的是地址;

int *arr[5];

arr是一个数组,里面存放的每个元素都是整形指针;

###数组名

在上文中多次提到,数组名就是首元素地址,这是一般情况

1.sizeof(arr)->arr代表整个数组

2.&arr->代表整个数组

int main()
{
    int arr[10]={0};
    printf("%p\n",arr);
     printf("%p\n",arr+1);
    printf("%p\n",&arr);
    printf("%p\n",&arr+1);
    return 0;
}

arr+1 跳转四个字节, &arr+1跳转40个字节,代表&arr代表整个数组

猜你喜欢

转载自blog.csdn.net/weixin_42139044/article/details/84194806
今日推荐