C博客作业05--指针
| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| ---- | ---- | ---- |
| 这个作业的地址 | C博客作业05--指针 |
| 这个作业的目标 | 学习指针相关内容 |
| 姓名 | 雷正伟 |
0.展示PTA总分
1.本章学习总结
1.1 指针定义、指针相关运算、指针做函数参数
1.11指针定义
在C程序中还有一种使用变量的方法.即通过变量的地址进行操作:用指针访问内存和操纵地址。指针是用来存放内存地址的变量,如果一个措针变量的值是另一个变量的地址,就称该指针变量指向那个变量。
类型名 *指针变量名
- 类型名指定指针变量所指向变量的类型,必须是有效的数据类型,如int,float,char等。
- 指针变量名是指针变量的名称,必须是一个合法的标识符。定义指针变量要使用指针声明符"*"。
- 定义多个指针变量时,每一个指针变量前面都必须加上*。
- 指针变量被定义后,指针变量也要先赋值再使用,当然指针变量被赋的值应该是地址。
1.12指针相关运算
1. 指针初始化
- 不能用数值作为指针变量的初值
- 可以将一个指针变量初始化为空指针
int *p=NULL;
int *p=0;
2. 取地址运算和间接访问运算
int x=3,*p;
p=&x; //此时p的值为3(指针p指向x)
*p=7; //此时对指针p所指向的变量赋值相当于对x赋值,及x被赋值为7
(*p)++; //此时指针p和a都值都自增1
3. 赋值运算
int x = 3, *p, *q;
p1 = &a;
p2 = p1; //指针p,q都指向x
1.13指针做函数参数
一般来说函数只能通过return语句返回一个值,所以如果希望函数调用能将多个计算结果带回主调函数,用return语句是无法实现的,但是将指针作为函数的参数就能使函数返回多个值。
1.2 字符指针
字符指针:指向字符型数据的指针变量。每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。即将字符串的首地址赋值给字符指针,可让字符指针指向一个字符串。
char *p = "Hello"; //将保存在常量存储区的"Hello"的首地址赋值给p
char *p;
p = "Hello"; //两者是等价的(注:不能理解为将字符串赋值给p)
1.21相关函数
1. strcpy()函数--字符串复制函数
char* strcpy(s1,s2); //将字符串s2复制到s1
- 必须保证s1足够大,能够容纳下s2,否则会导致溢出错误。
2. strcmp()函数--两个字符串进行比较函数
int strcmp(s1,s2);
- strcmp()比较 str1 和 str2 的每一个字符,直到出现不到的字符,或者到达字符串末尾(即出现'\0')。
- 如果返回值 < 0,则表示 str1 小于 str2;返回值 > 0,则表示 str2 小于 str1;返回值 = 0,则表示 str1 等于 str2。
3. strcat()函数--字符串连接函数
char *strcat(s1,s2); //将s2的内容连接到s1后面,并将s1后面的'\0'放到连接以后的结束位置
4. strlen()函数--求字符串长度函数
len = strlen(s1); //求出字符串s1长度为len
4. 其他
常用字符串函数:字符串函数
1.3 指针做函数返回值
- 因为返回指针的函数一般都返回全局数据对象或主凋函数中教据对象的地址,而函数运行结束后会销毁在它内部定义的所有局部数据,所以函数返回的指针请尽量不要指向局部变量、局部数组和形式参数。
- 也可以定义静态变量,迫使即使是在函数内申请的局部变量也存储在静态存储区域,使它不因函数进程的结束而消亡。
1.4 动态内存分配
定义数组的长度的时候,必须指定长度,这是在编译期间就要确定的。当我们无法在编译期间确定到底需要多大的内存块,此时就无法定义数组的大小。
- 实际使用的元素数量超过了声明的长度,程序无法处理。
- 如果程序实际使用的元素数量较少,巨型数组会造成内存空间浪费。
此时就需要在运行的时候根据实际的情况(比如根据输入的数据的大小),来动态的申请内存空间,然后让指针指向这块新申请的内存。
相关函数
#include <stdlib.h>
void * malloc(size_t size);
void* `calloc`(size_t num,size_t size);
void free(void* pointer);
关于malloc:
- malloc所分配的是一块连续的内存,参数size是所分配的内存字节数。
- malloc的返回值是void* ,具体使用的时候需要做强制类型转换。当请求的动态内存无法满足的时候,malloc返回NULL,对每个从malloc返回指针都进行检查,确保它不是NULLL。
- malloc申请的动态内存中的数据是随机值,不会被初始化为0。
- malloc 实际分配的内存可能有会比请求的多。
关于calloc:
- calloc函数的参数包含了所需元素的数量以及每个元素的字节数,根据这些值可以计算出一共所需的内存大小。
- calloc会将申请的内存空间初始化为0。
关于free:
- free用于将申请的动态内存归还给系统。
- 当free的参数为 NULL 时,函数直接返回。
1.5 指针数组及其应用
PTA例题--jmu-c-二分查找
#include<stdio.h>
#define N 100
int BinSearch(int *a,int n,int key,int *count);
int main ()
{
int a[N],i,key;
int n,loc=-1,count=0;//loc找到数对应下标,count查找次数
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&a[i]);
scanf("%d",&key);
loc=BinSearch(a,n,key,&count);
printf("loc=%d,count=%d",loc,count);
return 0;
}
/* 请在这里填写答案 */
int BinSearch(int* a, int n, int key, int* count)
{
int left, middle, right;
left = 0;
right = n - 1;
while (left <= right)
{
middle = (left + right) / 2;
if (a[middle] == key)
{
(*count)++;
return middle;
}
else if (a[middle] < key)
{
left = middle + 1;
}
else
{
right = middle - 1;
}
(*count)++;
}
return -1;
}
1.6 二级指针
A(即B的地址)是指向指针的指针,称为二级指针,用于存放二级指针的变量称为二级指针变量.根据B的不同情况,二级指针又分为指向指针变量的指针和指向数组的指针。
1.7 行指针、列指针
1.71行指针
- 指的是一整行,不指向具体元素。
int (*p)[n];
1.7列指针
- 指的是一行中某个具体元素。