C语言指针 知识点

P { MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px }

内存 采用线性地址编码

 

变量的地址:系统为变量分配的内存单元地址(无符号整型数)

 

内存单元的首地址

 

存储内容:数据值

空间大小:数据类型

空间位置:地址

生存周期:存储类别

 

int a;  声明一个内存空间,大小为int类型的字节数

float b; 声明一个内存空间,大小为float类型的字节数

a = 3; 将3送到a所声明的内存空间去

b = 5; 将5送到b所声明的内存空间去

指针指向a的首地址

 

指针变量:存放变量的首地址

指针变量的类型:指向的内存中存放的数据的类型

指针变量的赋值:指针变量的值为地址,是个无符号整数

但不能直接将整型常量赋给指针变量

用变量的地址给指针变量赋值(求地址运算符&)

变量的类型必须与指针变量的类型相同

 

如果没有赋值,则指针变量的值是随机的(运行时风险)

赋空值NULL NULL字符的ASCII码是0

 

int *p;

p = NULL;

 

*p 标识指针变量p所指向的内存中的数据

p 指向内存空间首地址

 

int a=5, *p=&a;

&*p == &a

*&a == a

(*p)++ == a++

*(p++) == *p++

 

函数调用,将实参拷贝到形参声明的内存空间里

 

void swap(int *x, int *y){

        int *t = NULL;

        *t = *x; *x = *y; *y = *t

}

void main(){

        int a = 3, b = 5;

        swap(&a, &b);

        printf("%d %d\n", a, b);

 

指针与数组

数组:连续存放的若个个元素的集合

数组名就是指向第1个元素的指针(首地址)

int a[10], *p;

p=a 等价于p=&a[0];

 

数组元素的下标,统一按“基地址+位移” 的方式处理

位移量由元素类型决定(几个字节)

p+i, a+i,

*a == a[i] == *(p+i) == *(a+i)数组指针标识法

 

数组名a与指向数组首地址的指针变量p不同,a不是变量,不可能改变值(始终指向首地址)

 

 

数组指针的运算

 

1、赋值运算

 

2、加减运算

p +/- i 向后/向前移动下标

 

3、指针相减运算

p - a 求两地址间的间距(条件:类型相同,指向同一连续的存储区域)

4、移动指针

p++ p--

5、比较运算

p < q (依据:地址)

 

 

数组指针与函数参数

 

数组作为函数形参

 

指针与字符串

 

1、字符串的指针

 

C语言的字符串是以'\0'作结束符的字符序列

用字符数组存放字符串,(即含'\0'的字符数组可以看作字符串)

 

字符串指针就是字符数组的首地址

 

字符串指针变量

char *指针变量 

char *p, *q = "Language";

p = "This is a book."; //p指向字符数组的首地址,不存放字符串

 

char *p, c[10];

p = c;

 

常量在内存里没有存储空间

 

#include <stdio.h>

void main(){

        char *p, *q = "language";

        for (p = q; *p != '\0';)

                p++;

        for(p--; p>=q; p--)

                putchar(*p);

        putchar('\n');

}

 

 

字符数组与字符指针变量的比较

1、存储的内容不同

字符数组可以存字符串,存的是字符

字符指针变量存的是字符串在内存中的首地址

 

2、赋值方式不同

字符数组只能对各个元素分别赋值

字符指针变量只赋值一次,赋的是地址

char *p; p = "China";

 

3、当没有赋值时

字符数组名代表了一个确切的地址;

字符指针变量中的地址是随机的;

 

char *p = "abcd";

putchar(p[3]);

p[2] = 'x';

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值