C:指针与数组·上【指针类型,指针运算,二级指针,指针与数组(名),指针数组】
指针是什么
指针是一个变量,里面存放的是地址,通过存在指针里的地址能找到所需的变量单元,也说地址指向该变量单元。
指针和指针类型
(1)指针的大小:
32位平台上是4个字节,64位平台是8个字节。
(2)指针的使用与类型:
#include<stdio.h>
int main()
{
int a = 10;//定义一个变量,开辟了一块内存空间
int *p = &a;//对a取地址放到p里,p就是指针变量
return 0;
}
这段代码里指针变量的类型为int*,*表示p是一个指针,int表示p指向的类型为整型。
指针变量指向的是什么类型就应该用相应类型的指针来存放地址。如:char *,short *,float *等。
(3)指针类型的意义:
指针的类型决定了指针向前或向后走一步有多大距离。
指针的类型决定了对指针解引用是有多大的权限,如char *的指针解引用就只能访问一个字节,int *的指针解引用就可以访问4个字节。
指针和数组名
数组名是什么?举个栗子:
#include<stdio.h>
int main()
{
int arr[5] = {1,2,3,4,5};
printf("%p\n",arr);
printf("%p\n",&arr[0]);
return 0;
}
运行结果:
结论:数组名表示首元素地址。
因此可以写成以下形式:
int arr[5] = {1,2,3,4,5};
//int *p = &arr[0];
int *p = arr;
指针运算
- 指针±整数 ; 指针的关系运算
int *p;
*p++ = 0;
//
- 指针-指针
int my_strlen(char *s)
{
char *p = s;
while(*p != '\0')
p++;
return p-s;
}
指针减指针得到的是两个指针之间元素的个数,前提是这两个指针指向的是同一块内存空间的。
标准规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
二级指针
概念:二级指针也是存放地址的变量,存放的是一级指针变量的地址。
举个栗子:
int a = 10;
int *p = &a;
int **pp = &p;
这里的pp就是二级指针,*pp通过对pp中的地址解引用得到p,**pp是对pp中的地址解引用得到p再对p解引用得到a;
指针数组
指针数组是数组!!数组元素是指针的数组称为指针数组。
指针数组的类型:
整型数组:int arr2[6] = {0};
字符数组:char arr3[6] = {0};
整型指针数组:int* arr1[6];
找到规律了吗,数组的类型就是数组元素的类型,整型指针的类型就是int*,因此整型指针数组的类型也是int*。arr1是变量名,[]
的优先级高所以先和[]
结合,所以arr1[]
是数组,里面有6个元素,元素类型是int*,是指针。
完。
有建议或错误的地方请留言指出。