指针的一些小的知识点

(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先和*结合成为指针,再和()结合成为指向函数地址的指针

原文地址:https://www.cnblogs.com/cplinux/p/5734068.html