C语言笔记系列(六)--指针

1. 概念

指针的值是地址,大多系统内部由无符号整数表示,但它是一种新的数据类型,不是整数类型。

2. %p

int n=20;
printf("%d %p",n,&n);//分别输出值和地址

3. 数组和指针

  • 表达式
    一维数组:a[i] , *(a+i) , 指针时才可用a++
    二维数组:a[i][j] ,( (a+i)+j)
  • 带数组参量的函数
    函数处理数组时必须知道数组的地址和元素个数。
//四种声明等价
int sum(int *a,int n);
int sum(int *, int );
int sum(int a[],int n);
int sum(int [],int );
//定义只有两种,名称不可省略

//变长数组允许动态分配存储单元
//二维变长数组,两种声明等价
int sum(int r,int c,int a[r][c]);
int sum(int ,int int a[*][*]);
  • 数组地址、内容和指针关系
    这里写图片描述
  • 几种比较混淆的数组和指针
int *p; //p是指向int值得指针
int *pp[2]; //pp是数组,由两个指针组成的数组,指针是指向int值,可以用它来定义不规则数组。
int(*pa)[2]; //pa是指针,是指向两个int值数组的指针
int **p2; //p2是指针,指向指针的指针
//a1表示第一行数组的地址,a1[0]表示第一行第一个元素的地址;
//a1+1表示第二行数组的地址,a1[0]+1表示第一行第二个元素的地址;
int a1[3][2];
pp[0] =p = &a1[0][0]; 
pp[1] =p = a1[0];

int a2[2][3];
pa = a1; //pa = a2是错误的

p2 =&p;
p2 =&a1[0];
  • 字符串
char s[] = "I love";
char *p = "I love";
//主要区别是s是个常量,p是个变量,只有指针可以使用自增运算符,其他使用差不多。

4. const和指针

  • 当设计意图是函数不改变数组的内容,则可以给函数声明和定义时的形式参量使用const。
  • 这只是说明函数在处理时应把数组当做固定不变的,他并不要求原始数组固定不变。
  • const指针不能赋给非const指针,但非const指针允许赋给const指针,前提是只能有一层间接运算。
  • 只有非const数据的地址才可以赋给普通指针。
  • 只可以修改数据的指针
int *const p = a; //a是数组
p = 1; //允许
p = &a[1]; //错误,只可改数据不可改地址
  • 不可改数据也不可改地址的指针,简称const指针
const int *p = a; //上面两种都不允许使用

5. 结构指针

struct{
int code;
float f;
}item, *p;
p = &item;
// p->f, (*p).f, item.f

6. 函数和指针

void toUp(char *);
void *toLow(); //指针函数,是返回某一类型指针的函数
void (*p)(char *); //函数指针,是只能指向接受char*参数返回为void函数的指针
p = toUp; //toUp是函数toUp()的地址
(*p)("aa");
p("aa");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值