C语言指针1

指针与指针变量

每一个地址对应一个存储单元,不同的数据类型占用对应字节大小个地址。在大多数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类型的值。

  • 13
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值