欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言指针 知识点 博客分类: 学习笔记 CC++C#D语言 

程序员文章站 2024-03-18 21:29:22
...

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';