C语言指针 知识点 博客分类: 学习笔记 CC++C#D语言
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';