指针数组和数组指针
指针数组可以简单地理解为装着指针的数组;
指针数组定义时,类型与存储地址所指向的类型一致 ;
*arr[ 4 ]:根据优先级,因为“[ ]”的优先级要比“*”要高,所以arr先与“[ ]”结合,构成一个数组的定义,数组名为 arr,再结合*,这个数组的元素是指针类型,共4个元素,也就是说,该数组包含 4个指向 int 类型数据的指针,这是“指针的数组”,即指针数组。
获取数组长度其中一种方法是使用sizeof(array) / sizeof(array[0])。
在C语言中习惯上在使用时都把它定义成一个宏,比如:
#define GET_ARRAY_LEN(array,len) {len = (sizeof(array) / sizeof(array[0]));}
数组指针:本质是一个指针变量,这个指针指向一个数组的首地址
对于语句“int(*pa)[4]”,“( )”的优先级比“[ ]”高,“*”号和 pa 构成一个指针的定义,指针变量名为 p2,而 int 修饰的是数组的内容,即数组的每个元素。也就是说,pa 是一个指针,它指向一个包含 3*4 个 int 类型数据的数组.
练习一下打印:
只读指针变量和只读变量指针
只读指针变量
只读指针变量,从const往左看,优先结合*,说明是只读指针变量
void fun(void)
{
int a=100;
int b=200;
int *p; //定义int 类型指针变量
p=&a; //初始化指针变量p
p=&b;
int *const p2=&a;//只读指针变量,从const往左看,优先结合*,说明是只读指针变量
printf("p所指向的内容是:%d\n",*p);
a=300;
printf("a修改后的内容是:%d\n",a);//值可以修改
p2=&b; //指针不可以修改
*p2=&b;//可以修改
}
只读变量指针
从const往左看,优先结合int,说明是只读变量指针
#include <stdio.h>
void fun1(void)
{
int a=100;
printf("a的内容是:%d\n",a);
int b=200;
// int *p; //定义int 类型指针变量
// p=&a; //初始化指针变量p
// p=&b;
// p2=&b;
a=300;
printf("a修改后的内容是:%d\n",a);
int const *p2=&a;//只读指针变量,从const往左看,优先结合int,说明是只读变量指针
//*p2=400; 只读变量指针,无法修改内容
a = 400;//通过变量本身可以修改内容
printf("p所指向的内容是:%d\n",*p2);
}
普通指针变量,可以修改指针变量的值,也可以修改指针变量的地址;
只读指针变量,值可以修改,地址不能修改;
只读变量指针,值不能修改,地址也不能修改;