C语言指针突破


指针的基本概念

指针常量:计算机的内存地址
指针值:利用地址运算符号获得该值
指针变量:保存指针值的变量

“&”的使用

&:称为地址引用计算符,位于变量之前的&将可返回该变量的地址

&只能用于单个变量或一个数组元素

“*”的使用

*:称为反引用运算符

//i.e -1
p = &quantity;n = *p;
//上面这句的等价推导
n = *&quantity = quantity;

*ptr=25;该句相当于将25赋值给ptr指向的数据变量

指针变量的申明

data_type *pt_name
1. *号说明pt_name是一个指针变量
2. pt_name需要一个内存空间
3. pt_name是指向data_type类型的变量的指针

pt_name 分配的内存长度与指向的变量类型有关,同是指针,指向不同类型的变量,则比例因子不一样

指针变量的初始化
//i.e -2
int *p
p = &quantity;

或者

int *p = &quantity;

本句中初始化与申明结合到一起,是对p初始化而非*p
同样,也可以使用该语句同时声明变量和指针变量

int x,*p = &x;

初始化指针使用的常量只能是null或0

指针键

指针的指针的声明
int **p指向整型指针的指针

指针的表达式

1. 指针指向的变量参与运算

eg:

//i.e -3
y=*p1**p2;
sum += *p;
z = 5*-*p2/*p1;
2. 指针值与整数进行运算
//i.e -4
p1+4
p2-2
p1-p2

如果P1,P2指向同一数组,|P1-P2|给出P1和P2间元素的数量

3. 指针使用快捷运算符
//i.e -5
p1++
-p2
sum += *p2
4. 指针使用关系运算符
//i.e -6
P1>P2
P1 == P2
P1 != P2

指针的递增与比例因子

指针可以进行p1+1 p1+2的运算,但当指针使用P1++时,指针指向相同类型的下一个值
当指针进行递增时,所增加的值为该指针所指向的数据类型长度,这个长度成为比例因子

可以用`sizeof(x)运算符得到x变量所需要的字节数

指针与数组

(1) 当声明一个数组时,编译器在临近的内存空间分配一个基本地址和足够的存储空间,基本地址就是数组的第一个元素的存储位置。

即,数组名是一个指向第一个元素的常量指针

p = x => p = &x[0] //两者是等价的,之后可以通过p++访问每一个值

和之前有区别的是,这里 p+1 = &x[1] p+2 = &x[2]
这里的p的增加,也是按照比例因子变化的

当需要遍历一个数组时可以

//i.e -7
p=x;
while(p<=&x[4]) //x是含有5个元素的数组
{
    ......
    p++
}

(2) 用指针操纵二维数组
对于a[i][j]可以用*(*(a+i)+j)实现
其中a+i指向为第i+1行的第一个元素
对于一个静态的二维数组a[5][4] 其存储是在一片连续的内存,访问a[i][j]时,a[i][j] = *(p+4*i+j)
故声明二维数组时,需指定每行的大小,编译器才能确定正确的存储映射。

指针与字符串

创建字符串的两种方法
(1) 字符数组 char str[5]="good";
(2) char类型指针 char *str = "good";

指针指向good的第一个字符

//i.e -8 
char *string1;
string1 = "good";
//string1  为指向字符串的指针,也是字符串的名字

指针数组

指针用于处理字符串表时,可以用指针元素指向字符串

//i.e -9
char *p[3] = {
                "newzealand",
                "australia",
                "india"
             };

注意 *p[3](*p)[3]的区别
前者表示把p声明为含3个指针变量的数组,后者表示申明为指向含有3个元素的数组的指针

指向函数的指针

(1) 声明: `type (*fptr)()
(2) 把函数名赋给指针就可以
把函数指针指向某个函数

无括号时 type *fptr() 为声明fptr为一个函数,函数返回指向type类型的指针

//i.e -10
double mul(int,int);
double (*p)();
p = mul;
(*p)(int a,int b); //函数调用

指针类型的兼容性与类型转换

(1) 声明为指针的变量不止是一个指针类型的变量,他也是指向某种基本数据类型的指针。不同类型的指针之间不能相互赋值,这称为指针的不可兼容性。
(2) 不同类型的指针变量存储的都是内存地址,这些内存地址是兼容的,利用类型转化运算符就可以在不兼容的指针类型之间显式的进行赋值操作。

\\i.e -11
int x;
char *p;
p = (char*)&x;

(3) 空指针(void *)是通用指针,可以表示任何指针类型。所有指针类型都可以赋值给空指针,空指针无需类型转换就可以赋给任意指针

指针与结构体

当指针指向struct 类型的变量时,可以通过->箭头运算符访问其成员,如
ptr->number == (*ptr).number
“.”运算符比”*”运算符的优先级高

运算符”->” , “.” , “[]” , “()”的优先级最高

//i.e -12
++ptr->count //表示count递增
(++ptr)->count //ptr递增,然后与count连接
*ptr->p //获取p指针指向的值
(*ptr->p)++ //p指向的内容递增
*ptr++->p //访问ptr指向的内容后ptr递增

以上,最近博主在学数据结构,如果碰到了问题会继续补充。

转载请注明出处。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值