指针与指针变量
每一个地址对应一个存储单元,不同的数据类型占用对应字节大小个地址。在大多数32位操作系统中,一个指针通常占用4个字节(32位),而在64位操作系统中,一个指针通常占用8个字节(64位)。所以在不同的系统架构下,指针的大小可能会有所不同。4/8个指针变量地址存放着一个变量地址,
int a ;int *p =&a ;//定义时*指的是定义一个指针变量 存放a的地址 。
*p=b ;b=5; -> *p = 5// 表示a=5 (间接访问) // 在其他地方表示取指针变量指向的变量的值。
&a;//取a变量的地址 printf(''%p'',a) 表示打印a的地址。
指针与数组
数组名是数组第一个元素的地址。%p打印地址
int a[10]; int *d ; d=a; //d是数组a,d=&a[0];d是数组a的第一个元素的地址//数组指针变量
*p+1 和*(p+1)不同意思//前者p指向的变量的值+1 , 后者指针+1意味着p(数组)的下一个元素
还有字符指针变量 *str = '' abcd/0 '' //str[0]=a;str[1]=2;
地址变量可以++,数组指针变量 (例子)str是不能++ //数组名只是一个地址
在表达式 *p++
中,*p
表示取指针 p
指向的值,而 p++
则是一个后缀递增运算符,表示先取值再递增指针 p
。对于指针的递增操作,取决于指针指向的数据类型
数组元素全为指针的数组称为指针数组
(数据类型)char *str[5]={‘’ ‘’,‘’ ‘’,’‘ ’‘,’‘ ’‘, ’‘ ’‘} //间接执行了几步
例子:char *str[5]={*strPtr1,*strPtr2,*strPtr3,*strPtr4,*strPtr5} //定义一个数组指针变量 char *strPtr1 = strPtr; // 定义一个字符指针变量 strPtr[ ] = "Hello, World!"; // 字符指针指向一个字符串常量;
数组指针是指向(数据类型)(几元素)数组的指针, int arr[] = {10, 20, 30, 40, 50};
// 定义一个整型数组 int (*p)[5] =&arr ->printf(''%d\n '' ,*(*p+i) )
我们将数组 arr 的地址赋值给指针 p,即 int (*p)[5] = &arr;我们使用表达式 *(*p+i) 来访问数组中的第 i 个元素,并通过 printf 函数输出该元素的值。需要注意的是,i 是一个变量,表示要访问的元素的索引。
指针与二维数组
二维数组int a[ 3] [ 3] ={ {1,2,3}, { 4,5,6} ,{7,8,9}} 其实就是一个指针数组,存放着三个数组指针的组。//二维数组其实是一维数组的线性拓展以此类推
&a[0][0] 的地址等价于 a[0]的地址 //(a[0][0]看是以a[0]为数组名的一个数组,a[0]的第一个元素的地址就是a[0][0]的地址)
a可以看作以a为数组名的一个数组(a[0]的地址就是a),数组里面以a[0],a[1],a[2]……为数组名的数组。a+1就是第二行的数组的地址【第一个子数组的地址加上1行的偏移量(一行的偏移量 = 1* 列数 * size)】
假设a
是一个二维数组,那么可以使用指针来访问它的元素。对于a[i]
,可以用指针表示为*(a + i)
,这表示指针从数组a
的起始位置向后移动i
个元素的位置,然后对这个地址进行解引用操作。对于a[i][j]
,可以用指针表示为*(*(a + i) + j)
,这表示先从a
的起始位置向后移动i
个元素的位置,得到指向a[i]
的指针,然后再从a[i]
的起始位置向后移动j
个元素的位置,最后对这个地址进行解引用操作。
表达式&(* (a+1))
表示获取*(a+1)
的地址。这个表达式中,(a+1)
表示取二维数组a
中第2行的地址,然后*
对这个地址进行解引用操作,即获取第2行的第一个元素的值。最后,&
操作符用于获取这个值的地址。
指针的指针
int a =123; int *p = &a;//定义了一个指向整形变量的指针变量 p ->a->123 int **pp = &p//定义了一个指向整形指针变量的指针变量 pp-> p ->a->123
静态指针变量
const int *p = &a//意味着p = 123 // p = 124(是会报错的)(不能直接改)但是可以通过 p =&b(p指向另一个变量来修改p最终指向的值) //指向常量的指针变量 ,p所指向的值是常量,不能通p 来修改该值。
int * const x =&a //定义了一个指针常量,x是一个指向整数的常量指针,即 x的值(即所指向的地址)是常量,不能通过 x 来修改指向的对象地址//x =&c(地址发生改变是会报错的)但 x = 124是可以的
指针函数
指针函数是指能返回指针的函数。在C语言和C++中,函数可以返回各种类型的值,包括整数、浮点数、结构体等等,也可以返回指针。(不能返回局部变量的指针)例子:int *p();
函数指针
函数指针是指向函数的指针。
例子:int (*P) (int);//定义一个参数类型为int的函数指针。用来指向函数.
(*P)(int) = (已经定义了的函数) sweet;//指向sweet这个函数,在C语言中,函数名本身就是函数在内存中的地址,因此你可以直接将函数名赋值给函数指针变量,而无需使用取地址操作符 &。
printf(结果为"%d",(*P)(int)); //打印 返回(*P)(int)指向的sweet( )函数的返回值。这种写法更清晰。
printf(结果为"%d", P(int));//也可以。这种写法更方便。 但是会让人误以为P(int)是一个普通的函数。
一个函数的函数名可以是另一个函数的返回值 {返回值也可以是一个(函数)指针};
例子:int (*P(char))(int,int);//函数名是(*P(char))指向的函数的返回值,该指向的函数有两个int参数,返回值为int类型的。
//函数P 接受一个char
类型的参数,根据char类型的参数返回一个指针,这个指针指向一个函数,该函数接受两个int
类型的参数,并返回一个int
类型的值。