第8章 指针-6从函数返回字符串
《C语言程序设计》第8章指针
![《C语言程序设计》第8章指针](https://img.taocdn.com/s3/m/b830b1fce2bd960591c677ab.png)
10.3.3 指针变量和数组作函数参数 数组名作形参时,接收实参数组的起始地址;
作实参时,将数组的起始地址传递给形参数组。
引入指向数组的指针变量后,数组及指向数 组的指针变量作函数参数时,可有4种等价形式 (本质上是一种,即指针数据作函数参数):
(1)形参、实参都用数组名 (2)形参、实参都用指针变量 (3)形参用指针变量、实参用数组名 (4)形参用数组名、实参用指针变量
(4)指针变量的++、--与&、*的结合
对于指针变量的++、--与&、*的结合 使用,关键要注意按照运算符的优先级和 结合性进行。
例如: int a=2, *p; p=&a;
•表达式:(*p)++,按运算符的优先级,等价于 a++。其含义为:取出指针变量p所指向的内存单 元的值(即a的值),a的值加1,送回a的内存单 元,a的值变为3,p的值未发生变化,仍然指向 变量a。
程序说明:printf("%s\n",s);语句 通过指向字符串的指针变量s,整体引
用它所指向的字符串的原理:系统首先输出s 指向的第一个字符,然后使s自动加1,使 之指向下一个字符;重复上述过程,直至遇到 字符串结束标志。
main() { char string[ ]=”I love Beijing.”; printf(“%s\n”,string); }
3.数组元素的引用 数组元素的引用,既可用下标法,也可用
指针法。
10.3.2 通过指针引用数组元素 如果有“int a [10],*p=a;” ,则: (1)p+i和a+i都是数组元素a [i]的地址。
(2)*(p+i)和*(a+i)就是数组元素a [i]。 int a [3]; a [0]——*a a [1]——*(a +1) a [2]——*(a +2)
C语言程序设计知识点—第8章 指针结构体与预处理命令
![C语言程序设计知识点—第8章 指针结构体与预处理命令](https://img.taocdn.com/s3/m/4b1912c3bb4cf7ec4afed037.png)
指针使用示例 2 void main() { int num1 = 50, num2 = 100; int *ptr1, *ptr2; ptr1 = &num1; printf(" num1 的值是: %d", *ptr1); printf("\n num1 的地址是: %x \n", ptr1); ptr2 = &num2; printf("\n num2 的值是: %d", *ptr2); printf("\n num2 的地址是: %x \n", ptr2); *ptr2 = *ptr1; printf("\n 重新赋值后 num2 的值是: %d", *ptr2); printf("\n 重新赋值后 num2 的地址是: %x\n", ptr2); }
C 语言程序设计知识点
主讲教师:杨剑
第 8 章:指针、结构体与预处理命令
1. 本章目标
理解指针的概念 定义指针变量 掌握对指针的操作 理解指针和数组的关系 理解结构体的概念和定义 理解预处理指令
2. 内存地址
内存是一个连续编址的空间,每一个存储单元都有一个固定的编号,称为内存地址。 内存地址通常用 16 进制数表示。
C二级 第8章 指针
![C二级 第8章 指针](https://img.taocdn.com/s3/m/7255b937b4daa58da0114a8a.png)
1.以下定义语句中正确的是A) int a=b=0; B) char A=65+1,b='b';C) float a=1,*b=&a,*c=&b; D) double a=0.0; b=1.1;参考答案:B【解析】A选项语句中b变量还没有定义不能直接用于给a变量赋值。C选项语句中*b、*c表示的是一个实型变量的地址,不能再将&b赋值给指针型变量c。D选项语句中a=0.0后面应该为逗号,不能是分号。2.有以下程序#include <stdio.h>void f(int *p,int *q);main(){ int m=1,n=2,*r=&m;f(r, &n);printf("%d,%d",m,n);}void f(int *p,int *q){ p=p+1;*q=*q+1;}程序运行后的输出结果是A) 2,3 B) 1,3 C) 1,4 D) 1,2参考答案:B【解析】在f(int *p,int*q)函数中,执行p=p+1是将p所对应的地址加1,而*q=*q+1是将q所指向的n的地址所对应的值加1,所以m的得知所对应的值没有变,而n的值则为3了。
因此B选项正确。
3.以下叙述中正确的是A) 如果p是指针变量,则&p是不合法的表达式B) 如果p是指针变量,则*p表示变量p的地址值C) 在对指针进行加、减算术运算时,数字1表示1个存储单元的长度D) 如果p是指针变量,则*p+1和*(p+1)的效果是一样的参考答案:C【解析】B选项中,如果p是指针变量,则*p表示变量p所指向的地址的值;A选项中,如果p是指针变量,则&p表示变量p的地址;D选项中,如果p是指针变量,*p+1表示将p所指的值加上1,而*(p+1)表示的是先将指针右移一位再取所指向变量的值。
因此C选项正确。
4.以下叙述中正确的是A) 基类型不同的指针变量可以相互混用B) 函数的类型不能是指针类型C) 函数的形参类型不能是指针类型D) 设有指针变量为double *p,则p+1 将指针p移动8个字节参考答案:D【解析】B选项中,所谓函数类型是指函数返回值的类型。
函数指针作为返回值
![函数指针作为返回值](https://img.taocdn.com/s3/m/33683306bf1e650e52ea551810a6f524ccbfcbe1.png)
函数指针作为返回值在C语言中,函数指针是一种非常强大且常用的概念。
它允许我们将函数作为参数传递给其他函数,但你可能不知道的是,函数指针也可以作为函数的返回值。
本文将介绍函数指针作为返回值的用法和优势。
一、函数指针简介函数指针是指向函数的指针变量,它可以用于存储函数的地址。
通过函数指针,我们可以以变量的形式调用函数,这在某些场景下非常有用。
二、函数指针作为返回值在C语言中,函数可以返回各种类型的值,如整数、浮点数、结构体等。
但你可能不知道,函数还可以返回函数指针。
1. 返回具体函数的指针可以将函数指针作为返回值的函数称为高阶函数。
它们可以根据不同的条件返回不同的函数指针,实现动态选择函数的功能。
示例代码:```c#include <stdio.h>int add(int a, int b) {return a + b;}int sub(int a, int b) {return a - b;}int (*getCalculator(char op))(int, int) { if (op == '+') {return add;} else if (op == '-') {return sub;} else {return NULL;}}int main() {int a = 10;int b = 5;char operator = '+';int (*calculator)(int, int) = getCalculator(operator);if (calculator != NULL) {int result = calculator(a, b);printf("Result: %d\n", result);} else {printf("Invalid operator\n");}return 0;}```上述代码中,getCalculator函数根据传入的操作符返回对应的函数指针,然后在main函数中通过函数指针调用具体函数。
c语言函数参数传递指针返回字符串
![c语言函数参数传递指针返回字符串](https://img.taocdn.com/s3/m/8a8212bcc9d376eeaeaad1f34693daef5ef713a8.png)
c语言函数参数传递指针返回字符串摘要:1.引言2.C 语言函数参数传递指针的概述3.返回字符串的方法4.示例代码5.总结正文:【引言】本文将介绍如何在C 语言中通过指针传递函数参数并返回字符串。
在C 语言中,函数是一种可以实现代码重用的方法,通过将一些代码封装成一个独立的单元,可以提高代码的可读性和可维护性。
在函数中,我们可以通过传递指针来实现对参数的修改,并返回一个字符串。
【C 语言函数参数传递指针的概述】在C 语言中,函数参数传递分为两种:值传递和指针传递。
值传递是指将实参的值复制给形参,而指针传递则是将实参的地址传递给形参。
指针传递的优点在于,它可以在函数内部修改实参的值,并在函数外部看到这些修改。
这对于处理字符串等需要动态分配内存的数据结构非常有用。
【返回字符串的方法】要返回一个字符串,可以使用字符数组或字符指针。
在函数内部,可以使用动态内存分配函数(如malloc)为字符串分配内存,并在函数结束时使用free 释放内存。
这里以字符指针为例,介绍如何返回字符串。
【示例代码】下面是一个示例代码,演示如何使用指针传递函数参数并返回字符串:```c#include <stdio.h>#include <stdlib.h>#include <string.h>char* createString(char* str, int length) {// 动态分配内存str = (char*) malloc(length + 1);if (str == NULL) {printf("内存分配失败");exit(0);}// 初始化字符串for (int i = 0; i < length; i++) {str[i] = "a" + i;}str[length] = "0";return str;}int main() {char* result;int length = 5;result = createString(NULL, length);printf("返回的字符串为:%s", result);free(result);return 0;}```【总结】本文介绍了如何在C 语言中通过指针传递函数参数并返回字符串。
第8章 指针
![第8章 指针](https://img.taocdn.com/s3/m/6d8bfc1e6edb6f1aff001fc0.png)
已说明过,且变量类型应与指针类型一致。
可以用一个已赋初值的指针去初始化另一 个指针变量。 不要用一个局部变量去初始化 static 型指针。
4、间接引用指针
与指针有关的两个运算符 & 取地址运算符 * 实例: 指针运算符(或称“间接引用”运算符)
void main(){
int a=10; int *pointer_1; pointer_1 = &a; cout<< * pointer_1;
第
8.1 指针概念
8章
指针
8.5 const指针
8.6 指针与函数
8.2 指针运算
8.3 指针与数组
8.7 字符指针
8.4 堆内存分配
8.9 命令行参数
本章介绍C++的指针。C++语言拥有在运行时获得变量的地址和操作地址 的能力,这种用来操纵地址的特殊类型变量就是指针,指针对于成功地进 行c++语言程序设计是至关重要的。学习本章后要求能够使用指针,能够用 指针给函数传递参数,理解指针、数组和字符串之间的紧密联系,能够声 明和使用字符串数组,正确理解命令行参数。
值。 实例:ch8_9.txt
【 8.5 const指针】
指向常量的指针(常量指针):
在指针定义语句前加上const,表示指向的对象是常量。 不能通过指针来改变所指对象的值,但指针本身可以改 变,可以指向另外的对象。 例: const int a=78;
const int b=28; int c=18; const int *pi=&a; *pi=58; pi=&b; *pi=68; pi=&c; *pi=88; c=98;
C语言程序设计第八章 优化学生成绩分析系统指针.ppt
![C语言程序设计第八章 优化学生成绩分析系统指针.ppt](https://img.taocdn.com/s3/m/a4698314caaedd3382c4d360.png)
C语言程序设计
1 指针与字符串(5)
1.2 使用字符串指针变量与字符数组的区别(续) 例2 分析下面程序的运行结果
main() { char *a="I Love China!";
a=a+7; printf(“%s\n",a); }
运行结果: China!
9
项目八 优化学生成绩分析系统-指针
C语言程序设计
int a,b,c;
例sc6an将f(给"%出d的,%程d"序,&修a,改&b为);使用函数指针变量定义
的c=方m式ax(a,b);
c=(*p)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}
max(int x,int y)
{
int z;
if(x>y) z=x;
else z=y;
指针数组,有4个元素,每个元素 都是指向整型变量指针变量
Int (*p)[4];
由4个整型变量组成的数组的指针
21
项目八 优化学生成绩分析系统-指针
#include <stdio.h> ma3in指()针数组 (2)
C语言程序设计
p[0]
11
{ 3.1 指针数组(续)
22
static int
33
a[3][4]={{11,22,33,44},{55,66,77,88},{99,110,1224,4133}};
【项目分析】
为了保存一个班的C语言成绩需要借助于一维数组,通过指针对其数 据进行操作。将本项目分成两部分,首先借助于指针对一维数组进 行访问,然后介绍一种新的排序算法—选择排序。
函数返回字符串
![函数返回字符串](https://img.taocdn.com/s3/m/531bf463f6ec4afe04a1b0717fd5360cbb1a8d5e.png)
函数返回字符串在编程语言中,函数是一组可重复使用的指令,通常被设计用于执行一个特定的任务。
函数具有接受参数和返回值的功能,而返回值可以是任何数据类型,包括布尔值、数字和字符串等。
本文将重点介绍函数返回字符串的用法和实例。
函数返回字符串是什么?函数返回字符串是指一个函数可以返回一个包含字符、数字、符号和空格等一系列字符的数据类型。
字符串通常被用于表示文本信息,比如人名、地址、邮件、等等。
在函数中,我们可以使用特定的语法来将一些字符类型的数据拼接成字符串后返回。
如何实现函数返回字符串?在大部分编程语言中,函数返回字符串的实现方法都是非常相似的。
具体可以分为以下几个步骤:1. 声明一个函数:首先我们需要用关键字“function”声明一个函数,为函数起一个名称,括号里面可以放置一些参数。
2. 定义函数体:在函数体内部,我们可以使用一些语句操作数据,并将其拼接成字符串后返回。
3. 返回字符串:使用关键字“return”将处理好的字符串返回给函数的调用者。
函数返回字符串的实例下面以JavaScript为例,演示如何实现一个函数返回字符串的功能。
```javascript// 声明一个函数,输入两个参数function fullName(firstName, lastName) {// 定义一个变量,用于拼接字符串let fullNameStr = "Hello, my name is " + firstName + " " +lastName + ".";// 返回拼接后的字符串return fullNameStr;}// 调用函数并输出结果console.log(fullName("John", "Doe"));```上述代码中,我们通过定义一个变量fullNameStr,将字符串拼接成一个完整的句子,然后使用”return”关键字返回该句子作为函数的输出结果。
第8章 指针
![第8章 指针](https://img.taocdn.com/s3/m/da35cc4dc850ad02de804199.png)
8.3指针变量的运算
8.3.3指针的关系运算
• 程序分析如下: • (1)定义整型变量a,a表示学号;定义指针 变量p,p表示传达室。 • (2)变量a的地址赋值给p。 • (3)从键盘输入一个整数存入变量a中。 • (4)通过指针变量p输出a变量的值。
• • • • • • • • •
#include<stdio.h> main() { int a,*p; p=&a; printf(“请输入一个整数学号:\n”); scanf(“%d”,&a); printf("%d\n",*p); }
&a &b q
a 6 8 b
8.3指针变量的运算
8.3.3指针的算术运算
5.指针运算 (1)两个指针变量可以相减 • 如果两个指针变量都指向同一个数组中的 元素,则两个指针变量值之差是两个指针 之间的元素个数 (2)指针变量加(减)一个整数 例如:p++,p--,p+i,p-i,p+=i,p-=i等均是指 针变量加(减)一个整数。
找到i的地址 2000,从而从存 储单元读取3
int i=3,j=6,k; k=i+j; 从这里取3 从这里取6
将9送到这里
直接存取
int i=3,j=6,k; 定义特殊变量i_pointer
i_pointer=&i;
*i_pointer=50;
50
将i的地址 存到这里
间接存取
Байду номын сангаас i
直接存取
2000
8.2变量的指针和指向变 量的指针变量
8.2.2指针变量初始化
• (1)将一个已经定义的变量的地址赋值 给指针变量。 • int i=5; • int *p=&i; /*将整形变量i的地址赋 值给整形指针p*/ • 上述语句等价于: • int i=5,*p=&i;
c语言返回字符串的函数
![c语言返回字符串的函数](https://img.taocdn.com/s3/m/dc7ccb1aa4e9856a561252d380eb6294dd8822d0.png)
c语言返回字符串的函数以C语言返回字符串的函数为标题在C语言中,字符串是一种非常常见的数据类型。
为了方便处理字符串,我们经常需要编写一个返回字符串的函数。
本文将详细介绍如何在C语言中编写一个返回字符串的函数,并给出一些实例来帮助读者更好地理解。
一、返回字符串的函数定义在C语言中,返回字符串的函数一般的定义形式如下:```char* function_name() {// 函数体return string;}```其中,function_name是函数的名称,char*表示该函数返回一个指向字符的指针,string是一个字符数组,即字符串。
二、使用字符数组返回字符串在C语言中,我们可以使用字符数组来存储字符串。
下面是一个简单的例子,演示如何使用字符数组返回字符串:```#include <stdio.h>char* get_string() {char str[6] = "Hello";return str;}int main() {char* s = get_string();printf("%s\n", s);return 0;}```在上面的例子中,get_string()函数返回了一个字符数组str,然后在main()函数中将其赋值给了一个字符指针s,并通过printf()函数输出了字符串。
需要注意的是,在上面的例子中,我们返回了一个局部变量str的指针,这是不安全的。
因为一旦函数执行结束,局部变量的内存空间会被释放,这样返回的指针就指向了无效的内存。
为了避免这个问题,我们可以使用动态内存分配来存储字符串。
三、使用动态内存分配返回字符串在C语言中,我们可以使用malloc()函数来动态地分配内存空间。
下面是一个示例,演示如何使用动态内存分配返回字符串:```#include <stdio.h>#include <stdlib.h>#include <string.h>char* get_string() {char* str = (char*)malloc(6 * sizeof(char));strcpy(str, "Hello");return str;}int main() {char* s = get_string();printf("%s\n", s);free(s);return 0;}```在上面的例子中,我们使用malloc()函数动态地分配了一个长度为6的字符数组,并将字符串"Hello"复制到了该数组中。
C语言第8章 指针
![C语言第8章 指针](https://img.taocdn.com/s3/m/bed3a50a844769eae009ed02.png)
例8-13 求最长字符串。
函数的返回值为指针,指针数组作函数参数。
8.5.2 执行函数的指针变量(P207)
P207 自学
8.6 指针应用举例 (P208)
P208 自学
8.7 动态内存管理 (P214)
动态分配存储空间
malloc( )函数 calloc( ) 函数
2. 变量地址示意图
变量 b 的地址:XXXX 变量b 4字节
例: float b; char c;
变量 c 的地址:XXXX 数组 a 的地址:XXXX
变量c 1字节
int a[2];
数组a 8字节
变量的地址示意图
8.1.1 指针和指针变量(P185)
指针
变量的存储地址称为该变量的指针。
指针变量
for (i=0;i<4;i++)
p[i]=&a[i*3]; printf ("%d\n",p[3][2]);
8.4 指针作为函数的参数 (P199)
指针变量 ① 形参是指针变量,对应实参是 变量地址 数组名 指针变量 ② 形参是数组名,对应实参是 变量的地址 数组名
8.4.1 指针作参数示例
例8-10 两数交换。形参为指针变量,实参为变量
char *p="abcd";
读下列程序段,分析输出结果
(1)
char s[]="ABCD";
char *p; for (p=s; p<s+4; p++) printf("%s\n",p);
读下列程序段,分析输出结果
c语言返回字符串的函数
![c语言返回字符串的函数](https://img.taocdn.com/s3/m/b5cbf92ca55177232f60ddccda38376bae1fe077.png)
c语言返回字符串的函数摘要:1.函数简介2.函数原型3.函数实现4.返回字符串的注意事项5.示例代码正文:C语言是一种广泛应用于系统编程和应用开发的编程语言。
在编写程序时,我们经常需要处理字符串。
本文将介绍如何使用C语言编写一个返回字符串的函数。
函数原型如下:```cchar *return_string(const char *str);```这个函数接收一个字符串指针作为参数,并返回一个字符串。
这里的返回类型是`char *`,表示返回的是一个字符指针。
函数名称为`return_string`,表示该函数用于返回字符串。
函数实现如下:```c#include <stdio.h>#include <string.h>char *return_string(const char *str) {if (str == NULL) {return NULL;}int len = strlen(str);char *result = (char *)malloc(sizeof(char) * (len + 1));if (result == NULL) {return NULL;}strcpy(result, str);result[len] = "0";return result;}```在函数实现中,首先检查输入的字符串指针是否为`NULL`。
如果是`NULL`,则直接返回`NULL`。
接下来,计算输入字符串的长度,并分配足够的内存空间来存储字符串。
然后使用`strcpy`函数将输入字符串的内容复制到新分配的内存空间中。
最后,返回新创建的字符串指针。
在返回字符串时,需要注意以下几点:1.确保分配足够的内存空间来存储字符串。
可以通过计算字符串长度并乘以字符大小(通常为1字节)来确定所需的空间。
2.在返回字符串之前,确保字符串以空字符(`0`)结尾。
这可以通过在字符串长度的基础上分配一个额外的字符空间来实现。
C语言程序设计教程第8章北京邮电大学出版社.
![C语言程序设计教程第8章北京邮电大学出版社.](https://img.taocdn.com/s3/m/950ee1ddd5bbfd0a795673e3.png)
第8章 指针
18
说明: 对于不同基类型的指针,指针变量“加上” 或“减去”一个整数n所移动的字节数(= sizeof( 指针所指对象的数据类型 ) )是不同的。 例如: float a[10], *p=a, *x; x=p+3; /*实际上是p加上3*4个字节赋给x, x依然指向数组的第三个分量*/
C语言程序设计教程
第 8 章 指针
8.1 8.2 8.3 8.4 8.5 8.6 指针与指针变量 指针与函数 指针与数组 指针与字符串 指针数组与命令行参数 程序举例
第8章 指针
2
8.1 指针与指针变量
8.1.1 指针的概念
1.内存与变量地址 内存地址:内存是计算机用于存储数据的存储 器,以一个字节作为存储单元,为了便于访问,给 每个字节单元一个唯一的编号,第一字节单元编号 为0,以后各单元按顺序连续编号,这些单元编号 称为内存单元的地址 。 变量地址:变量所分配存储空间的首字节单元 地址(字节单元编号)。
2018/9/14
C语言程序设计教程
第8章 指针
3
在程序中,对变量的操作实际上是通过地址来完成的。 • 定义时:定义变量→分配内存单元(按类型)→地址 (即内存中的编号) • 存取操作:程序 →变量名 →内存单元 →存取 • 实际上: 程序 →编译 →变量名 →变量的地址
2.访问方式
直接存取:把直接按变量名或地址存取变量值的方式 称为 “直接存取”方式。
2018/9/14
C语言程序设计教程
第8章 指针
10
8.1.3 指针运算
指针运算实际上是地址的计算,包括赋值运算、算术运算、 关系运算三种。
1. 指针的赋值运算 (1)将变量地址值赋给指针变量,使指针指向该变 量。
c语言程序设计第五版课后答案谭浩强第八章课后答案
![c语言程序设计第五版课后答案谭浩强第八章课后答案](https://img.taocdn.com/s3/m/5a8f1029366baf1ffc4ffe4733687e21af45ff04.png)
c语⾔程序设计第五版课后答案谭浩强第⼋章课后答案c语⾔程序设计第五版课后答案谭浩强习题答案第⼋章善于利⽤指针本章习题均要求使⽤指针⽅法处理。
1. 输⼊3个整数,要求按由⼩到⼤的顺序输出。
解题思路:先获取到三个变量的地址,然后获取三个数据,通过指针进⾏⽐较转换即可答案:#include <stdio.h>void swap(int *p_a, int *p_b){int temp = *p_a;*p_a = *p_b;*p_b = temp;}int main(){int a, b, c, *p_a = &a, *p_b = &b, *p_c = &c; // 获取每个变量空间的地址printf("Please enter three numbers:");scanf_s("%d%d%d", p_a, p_b, p_c);if (*p_a > *p_b) {swap(p_a, p_b);//通过指针进⾏指向空间内的数据交换}if (*p_a > *p_c) {swap(p_a, p_c);}if (*p_b > *p_c) {swap(p_b, p_c);}printf("%d %d %d\n", *p_a, *p_b, *p_c);system("pause");return 0;}2. 输⼊3个字符串,要求按由⼩到⼤的顺序输出。
解题思路:字符串的⽐较可以使⽤strcmp函数,返回值>0表⽰⼤于,返回值⼩于0表⽰⼩于,返回追等于0表⽰相同。
其他的⽐较排序思路与数字的排序交换没有区别,逐个进⾏⽐较先找出最⼤的,然后找出第⼆⼤的。
答案:#include <stdio.h>int main(){char str[3][32];char *p[3];printf("Please enter three strings:");for (int i = 0; i < 3; i++) {p[i] = str[i];scanf_s("%s", p[i], 32);//后边的数字限制缓冲区边界,防⽌缓冲区溢出访问越界}//让p[0]和p[1]/p[2]分别进⾏⽐较,找出最⼤的字符串,i+1之后,则让p[1]和p[2]进⾏⽐较,找出第⼆⼤//i循环总个数-1次,最后⼀个是不需要⽐较的for (int i = 0; i < 2; i++) {for (int j = i + 1; j < 3; j++) {if (strcmp(p[i], p[j]) > 0) {char *tmp = p[i]; p[i] = p[j]; p[j] = tmp;}}}printf("%s %s %s\n", p[0], p[1], p[2]);system("pause");return 0;}3. 输⼊10个整数,将其中最⼩的数与第⼀个数对换, 把最⼤的数与最后⼀个数对换。
chap8(指针)
![chap8(指针)](https://img.taocdn.com/s3/m/dfd99a6a561252d380eb6e35.png)
务必记住:*(a+i) 和 a[ i] 是等价的。
如果 a 是一维数组名,则a[ i]代表第 i+1个元素所占的 内存单元。但如果a是二维数组,则a[ i ]代表一维数组名, a[i]本身是不占用内存单元的, 也不存放元素值,而只是 一个地址。 a、a+i、a[ i]、*(a+i)、*(a+i)+j、a[ i]+j都是地址, 而*(a[ i]+j)、*(*(a+i)+j)是二维数组元素a[ i][ j]的值。
二、 字符串指针作函数参数
可以用地址传递的方式,即用字符数组名作 参数或用指向字符串的指针变量作参数,将一个 字符串从一个函数传递到另复制。 用字符数组作参数 void copy_string( from , to ) char from[ ] , to[ ] ; { int i = 0 ; while ( from[i] != „\0‟ ) { to[i] = from[i] ; i + + ; } to[i] = „\0‟ ; 运行结果: } string_a = I am a teacher. string_b = I am a teacher. main( ) {char a[ ] = “I am a teacher.” ; char b[ ] = “you are a student.” ; copy_string( a , b) ; printf( “string_a = %s\nstring_b = %s\n”,a,b); }
形参用字符指针变量 void copy_string(from , to) char *from , *to ; { for ( ; *from != „\0‟; from++; to++) *to = *from ; *to = „\0‟; } main( ) { char *a= “I am a teacher.”; char *b= “you are a student.”; copy_string(a,b); printf( “string_a = %s\nstring_b = %s\n”,a,b) ; }
C语言程序设计(第二版)-电子教案-丁亚涛-8587 第8章 指针
![C语言程序设计(第二版)-电子教案-丁亚涛-8587 第8章 指针](https://img.taocdn.com/s3/m/6d81ff0953d380eb6294dd88d0d233d4b04e3f56.png)
8.5.3 指针与二维数组
• 二维数组其实可以看成由一维数组构造而成。就相当于 几个队列构成一个方阵,方阵由队列组成,队列由具体 的元素--人组成。
• 一级指针只能管理队列,如果管理方阵,则需要二级指 针。
•int a=1000,*pa,**ppa; • pa=&a; • ppa=&pa;
• *(*(ppa)) ≡ *(pa) ≡ a ≡ 1000
• p是二级指针 • *p相当于*(p+0),级别降低为一级指针,相当于p[0] • **p相当于*(*(p+0)+0),级别降低为数组元素(普通变量),
也相当于p[0][0]
• p[1][2],相当于*(*(p+1)+2) • &p[1][2], 级别提升为一级指针,相当于:
• p[1]+2,*(p+1)+2 • &p[1],级别提升为二级指针,相当于:
f=f4; printf("a/b=%d\n",f(a,b));
8.5 指针与数组
• 8.5.1 指针与字符数组 • char str[100]= "Hello World"; • char *p=str; • 字符w可以有如下多种表示形式: • str[6] • *(str+6) • p[6] • *(p+6)
【例8-2】演示指针和数组的关系。
#include <stdio.h>
接可存取,由于p中存储的是x的信息。访问p可以获取x的信 息,再对银行存款进行操作。
8.1 借钱的故事
8.2 指针的概念
• C语言允许使用变量名、数组名[下标]、函数名等标 识符来访问内存
C语言程序设计第八章 指针的使用
![C语言程序设计第八章 指针的使用](https://img.taocdn.com/s3/m/a671ab6bf12d2af90242e6f0.png)
第八章指针的使用【学习目标】本章将详细介绍在C语言中如何使用指针。
学习要点包括如下几点:(1)掌握指针和指针变量的概念,了解指针变量的特点以及直接访问数据和间接访问数据的原理。
(2)掌握指针变量的定义、赋值方法及指针运算符的使用,熟练运用指针访问简单变量。
(3)熟悉指针和一维数组的关系,掌握指向一维数组的指针变量的定义方法,熟练使用指针变量访问一维数组元素。
(4)了解指针与字符串的关系,能熟练使用指针处理字符串。
(5)熟练掌握用指针变量作函数的参数时函数的定义和调用方法、数组名作函数的参数用法。
(6)指向指针的指针的运用。
【学习导航】本章的在整个课程中的位置如图5-1所示。
图8-1 本章学习导航在本书的第一章介绍C语言有一个灵活性的特点,那么它的灵活性具体体现在哪里呢?其实就是指针。
指针是C语言的精华部分,通过利用指针,我们能很好地利用内存资源,使其发挥最大的效率。
有了指针技术,我们可以描述复杂的数据结构,对字符串的处理可以更灵活,对数组的处理更方便,使程序的书写简洁,高效。
8.1 地址和指针指针是C语言的一种数据类型,类似于整型、字符型等。
既然指针也是一种类型,那么也可以定义该类型的变量,称为指针变量。
指针变量和其他类型的变量的区别是:指针变量存储的是地址。
所以要学好指针,就一定要明白数据在内存中是如何存储的。
计算机所有数据都是存储在存储器里,系统的内存可看作编了号的小房间,如果要取房间的东西(读取数据)就需要得到房间编号。
地址就是内存区中对每个字节的编号。
下面通过两个整型变量来说明。
整型变量x、y(基本整型需4个字节)在内存中的存储如图8-2所示(假设内存编号是从2000开始)。
把变量所占用的存储单元首字节的地址作为变量的地址。
C语言中利用取地址运算符“&”获取变量的存储地址。
例如,&c将返回c的首地址;&x将返回x的首地址。
2000H2004H2008H2012H...图8-2 变量x和y在内存中的存储图8-2中2000H和2004H就是内存单元的地址。
C语言实现返回字符串函数的四种方法
![C语言实现返回字符串函数的四种方法](https://img.taocdn.com/s3/m/15168c68178884868762caaedd3383c4bb4cb470.png)
C语⾔实现返回字符串函数的四种⽅法前⾔C语⾔返回字符串函数共有四种⽅式,分别如下:1. 使⽤堆空间,返回申请的堆地址,注意释放2. 函数参数传递指针,返回该指针3. 返回函数内定义的静态变量(共享)4. 返回全局变量下⾯来看看详细的介绍其实就是要返回⼀个有效的指针,尾部变量退出后就⽆效了。
使⽤分配的内存,地址是有效char *fun(){char* s = (char*)calloc(100, sizeof(char*) );if (s)strcpy ( s , "abc " );return s;}但这种⽅式需要注意,必须由使⽤将将返回的地址free掉将地址由⼊参传⼊char* fun(char*s){if (s)strcpy(s, "abc ");return s;}这种⽅式调⽤都要注意给s分配的⼤⼩是⾜够。
可以这样:char* fun(char*s, int len){if (s){strncpy(s, "abc ", len-1);s[len-1] = 0;}return s;}或才使⽤局部静态变量char* fun(){static char s[100];strcpy(s, "abc ");return s;}这种⽅式需要注意,不要修改返回的这个字符串,由于是共享地址,对它的修改会反应到每个调⽤者的。
可以这样:const char* fun(){static char s[100];strcpy(s, "abc ");return s;}还有⼀种是使⽤全局变量char g_s[100];char* fun(){strcpy(g_s, "abc ");return s;}同样的,也要注意这个变量可存储的最⼤空间。
总结以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家学习或者使⽤C语⾔能有所帮助,如果有疑问⼤家可以留⾔交流。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
H e l l o C h i n a \0
dstStr++;
}
pStr
dstStr
while(*srcStr != '\0') {
*dstStr = *srcStr; srcStr++; dstStr++; } *dstStr = '\0'; return pStr;
返回字符串首地址
}
C语言程序设计
C语言程序设计
第8章 指针
C语言程序设计
SuXiaoHong
Q&A
{
}
*dstStr = *srcStr; srcStr++; dstStr++;
*srcStr
srcStr++
Ch
in
*srcStr=='\0'
a \0
}
*dstStr = '\0';
srcStr srcStr srcStr srcStr srcStr srcStr
*dstStr
He
l
l
o \C0 h i n a \0
C语言程序设计
dstStr dstStr dstStr dstStr dstStr dstStr dstStr++
第8章 指针
编程实现strcat()的功能
char *MyStrcat(char *dstStr, char *srcStr)
{
char *pStr = dstStr;
while (*dstStr != '\0') {
char first[2*N+1]; /* 这个数组应该足够大 */ char second[N+1]; char *result = NULL; printf("Input the first string:"); gets(first); printf("Input the second string:"); gets(second); result = MyStrcat(first, second); printf("The result is: %s\n", result); return 0; }
第8章 指针
小结
明确字符串被保存到了哪里,明确字符指针指向了哪里
指向字符串常量的字符指针 指向字符数组的字符指针
向函数传递字符串的方法
向函数传递字符数组 向函数传递字符指针
从函数返回字符串的方法
数组和指针作函数形参 从函数返回指向字符串的指针 数组不能作为函数的返回值
strcat()的函数原型
char *strcat(char *dstStr, const char *srcStr);
C语言程序设计
第8章 指针
编程实现strcat()的功能
#include <stdio.h> #define N 80 char *MyStrcat(char *dstStr, char *srcStr); int main() {
C语言程序设计
第8章 指针
编程实现strcat()的功能
dstStr++
*dstStr
H e l l o \0
dstStr dsቤተ መጻሕፍቲ ባይዱStr dstStr dstStr dstStr dstStr
while (*dstStr != '\0') {
while(*srcStr != '\0')
dstStr++;
第8章 指针
——从函数返回字符串
第8章 指针
从函数返回字符指针
void MyStrcpy(char *dstStr, const char *srcStr); void MyStrcpy(char dstStr[], const char srcStr[]);
strcpy()的函数原型
char *strcpy(char *dstStr, const char *srcStr);