(1)指针的算术运算
1 int a; 2 char b; 3 int* pa=&a; 4 char* pb=&b; 5 //如果说pa的值本来是10,那么pa+1的值就会是14, 6 //如果pb的值本来是10,那么pb+1的值就会使11 7 //指针每做一次+i运算,实际上指针就增加了i*类型大小
1 #include<stdio.h> 2 int main(){ 3 4 int a[10]; 5 printf("a的值是:%d ",a); //1245020 6 printf("&a的值是:%d ",&a);//1245020 7 8 9 printf("a+1的值是:%d ",a+1);//1245024 10 printf("&a的值是:%d ",&a+1);//1245060 11 }
&a相当于一个执行int[10]的类型的指针变量。而a相当于一个执行int类型的指针变量。
(2)指针数组和数组指针
1 int *p[8];//因为优先级的关系,p要先和[]结合,那就说明p是一个数组,然后再与*结合, 2 //说明数组p的元素是指针,并且是指向整形的指针 3 4 int (*p)[8]//此时p先与*结合,说明p是指针,该指针指向有8个整数元素的数组。
1 int(*p)[10];//p是一个指针,指向一个有10个元素的整形数组,赋值时是p=&a;不能写成p=a; 2 int *p1[10];//p1是一个整型数组,每个元素是一个整型指针 3 int a[10]; 4 int b[20]; 5 //p = &b; Error:不能讲int(*)[20]类型的值,分配到int(*)[10]类型实体 6 p = &a;//当p指向一维数组时用此种方法赋值,但是当时二维数组时,例如int b[4][10];就可以直接赋值,p=b; 7 p1[1] = b;//一个整型指针,可以直接指向一个数组。 8 printf("sizeof(p)=%d ",sizeof(p));//值为4 9 printf("sizeof(a)=%d ", sizeof(a));//值为40 10
printf("p=%d
",p);//值和a的值相同
printf("p+1=%d
",p+1);//增加了40
11 printf("a=%d ",a); 12 printf("a+1=%d ", a+1);//值增加了4 13 printf("&a+1=%d ", &a + 1);//值增加了40
(3)sizeof与strlen的区别
首先:sizeof是运算符,求得是字符串的所有的值,把' '占用的空间也算上了,而strlen是函数,求得是字符串的个数,' '这个标记字符串结束的字符没有算。
其次:sizeof的参数可以是类型,而strlen必须是字符串变量
最后:sizeof()还可以求其他类型占用的空间,例如整型数组,整型变量,以及浮点型等。而strlen只能用于求字符串的字符串个数
1 void sizeofAndStrlen(){ 2 char varCh[] = "hello world!"; 3 printf("sizeof(varCh)=%d ", sizeof(varCh));//sizeof求得值空间的大小,不是字符串的个数,故值为13 4 printf("strlen(varCh)=%d ", strlen(varCh));//strlen求得是字符串的个数,不是空间的大小,故值为12 5 }
(4)数组和指针的区别
引用《剑指offer》中的一些话,在c/c++中,数组和指针是相互关联又相互区别的两个概念。当我们声明一个数组时,其数组名也是一个指针,该指针指向数组的第一个元素。我们可以用一个指针来访问数组,但是值得注意的是数组没有记录数组的大小,因此访问数组中的元素时,程序员要确保没有超出数组的边界。
1 int GetSize(int data[]){ 2 return sizeof(data); 3 } 4 void ArrayAndPointer(){ 5 int data1[] = { 1, 2, 3, 4, 5 }; 6 int* data2 = data1; 7 printf("the size of data1=%d ", sizeof(data1));//值为20 8 printf("the size of data2=%d ", sizeof(data2));//值为4 9 printf("the size of data3 =%d ", GetSize(data1));//值为4 10 }
答案输出的是20,4,4.data1是一个数组,sizeof求得是数组空间的大小。data2声明为指针,尽管它指向数组data1的第一个元素,但它的本质仍然是一个指针,所以值为4.
特别注意:当一个数组当做一个函数的参数进行传递时,数组就自动退化成了同类型的指针。因此尽管GetSize的参数被声明为数组,但它会退化为指针。
(5)函数指针与返回指针的函数的定义
int *fun(); fun先和()结合成为函数,在和*结合,返回指针
int (*fun)(); fun先和*结合成为指针,再和()结合成为指向函数地址的指针