【C语言连载五】--------指针

内容简介:

1、指针常量与常量指针,

2、指针与数组,

3、指针与函数,

4、指向指针的指针,

5、*void指针

指针://也叫指针地址,即一块内存地址

注意:

指针若没有初始化就拿去用,是很危险的,程序会崩溃(crash)——>野指针调用

一、指针常量与常量指针

指针常量: 是指针,指向的地址不可变(eg: 数组)

常量指针: 指向常量。

二、指针与数组:

【1】用指针遍历数组:

//遍历数组

int a[] = {10,
20,
30, 40,
50};

int count =
sizeof(a) /
sizeof(int);

//传统遍历

for
(int
i = 0; i < count; i++) {

printf("a[%d] is %d\n", i, a[i]);

}

//指针遍历

int
*p = a;

//不改变p的指向

for
(int
i = 0; i < count; i++) {

printf("a[%d] is %d\n", i, *(p + i));

}

//改变p的指向

for
(int
i = 0; i < count; i++) {

printf("a[%d] is %d\n", i, *p);

p++;

}

【2】*p++; *(p++); *(++p); ++(*p); (*p)++

int a[] = {10,
20,
30, 40,
50};

int
*p = a;

//以下语句均单独运行:

printf("%d\n”, *p);  //10

printf("%d\n",
*(p++));  //10  先把p取出,*p,然后再++

printf("%d\n",
*p++);    //10  //与上一个的效果一样

printf("%d\n",
*(++p));  //20  //p指向第二个元素,即a[1],<==>*(p+1)或*(a+1)

printf("%d\n",
++(*p));  //11  //<==> ++a[0]

printf("%d\n",
(*p)++);  //11  //<==> a[0]++

【3】访问数组元素:

for(int i = 0; i< 5; i++){

//四种方法,任一即可

printf("%d\n”,
a[i]);

printf("%d\n”, *(a + i));

printf("%d\n”, *(p + i));

printf("%d\n”, p[i]);

}

三、指针与函数:

【1】指针函数:是一个函数,返回值是指针

(1)//指针函数

char
* string(){

return
"wxhl";

}

//调用:(main函数中)

printf("wxhl is %s\n", string());

(2)//参数中带指针

void
sum(int
a,
int b,
int *result){

*result = a + b;

}

//调用:(main函数中)

int
a =
10, b =
5,
result =
0;

int *p = &result;

sum(a, b, p);

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

【2】函数指针:是指针,指向一个函数

【】#include
<stdio.h>

int
sum(int
a,
int b){//加法函数

return a + b;

}

int
minus(int
a,
int b){//减法函数

return a - b;

}

//在main函数中定义一个函数指针

//函数指针的类型取决于指向函数的返回值类型

int
(*p)(int,int)=sum;//<==>int
(*p)(int a,int b)= sum;

//使用

int result = p(10,
20);

printf("result is %d\n", result);

【】//我们可以将一个函数指针作为参数

int
testFun(int
a,

int
b,
int
(*p)(int
a,

int
b))

{

   
//调用函数指针p

int
result = p(a, b);
//a、
b在此处是实际参数,传入到函数指针p指向的函数中

return
result;

}

int
main(int
argc,
const
char * argv[]) {

//main中使用函数指针testFun

int
result;

result = testFun(8,
2, p);//p可换成sum

printf("result is %d\n", result);

result = testFun(8,
2, minus);

printf("result is %d\n", result);

【】对于void函数,函数指针的使用:

void
test()

{

printf("hehe\n");

}

//定义一个函数指针,指向test函数

void (*p1)() = test;

//使用

p1();

四、指向指针的指针:

int a =
10;

//指向数值的指针

int *p1 = &a;

// p2中的指针地址,指向p1

int **p2 = &p1;

printf("%d\n",**p2);

五、*void 指针

/*void指针可以指向任意类型*/

int
a =
10;

char
*string =
"wxhl";

printf("string is %s\n", string);

void *p1 = &a;  //指向数值的指针

void *p2 = string;  //指向字符串的指针

printf("a = %d\n", *((int
*)p1));

printf("string is %s\n", (char
*)p2);

五、QUestion

(1)什么是指针变量?

(2)怎么取出一个变量的指针地址,怎么取出指针指向的目标地址?

(3)如何通过指针遍历数组?

(4)什么是指针函数,什么是函数指针?

(5)什么是双重指针如何定义一个双重指针变量?

(6)数组中的数据元素在内存中是如何分配的?

(7)函数指针有什么作用?

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-03 21:58:23

【C语言连载五】--------指针的相关文章

嵌入式 Linux C语言(五)——指针与字符串

嵌入式 Linux C语言(五)--指针与字符串 一.字符串简介 1.字符串声明 声明字符串的方式有三种:字面量.字符数组.字符指针. 字符串字面量是用双引号引起来的字符序列,常用来进行初始化,位于字符串字面量池中,字符字面量是用单引号引起来的字符. 字符串字面量池是程序分配的一块内存区域,用来保存组成字符串的字符序列.多次用到一个字符串字面量时,字符串字面量池中通常只保存一份副本,一般来说字符串字面量分配在只读内存中,是不可变的,但是当把编译器有关字面量池的选项关闭时,字符串字面量可能生成多个

嵌入式linux C++语言(五)——友元

嵌入式linux C++语言(五)--友元 面向对象编程的类的设计机制实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,是类与外部的通信接口.在实践中,类外的某些函数需要频繁地访问类的数据成员,将类外的函数定义为类的友元函数.除了友元函数外,还有友元类,两者统称为友元.友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员. 友元可以是一个函数,该函数被称为友元函数. 一.

C语言 结构体指针赋值 incompatible types when assigning to type &#39;char[20]&#39; from type &#39;char *&#39;

strcpy(pstudent->name, "guo zhao wei "); 为什么错误,该怎么写,(红色行) 追问 为什么不能直接赋值啊, 追答 用char nnnn[20]定义的,用strcpy 用char *ppp定义的,用=来赋值 C语言 结构体指针赋值 incompatible types when assigning to type 'char[20]' from type 'char *'

Swift语言指南(五)--数字字面量和数字类型转换

数字字面量 整数字面量写法如下: · 十进制数,无前缀 · 二进制数,以 0b 为前缀 · 八进制数,以 0o 为前缀 · 十六进制数,以 0x 为前缀 下面所有整数的十进制值为 17 : 1 let decimalInteger = 17 2 let binaryInteger = 0b10001 // 17 二进制标识 3 let octalInteger = 0o21 // 17 八进制标识 4 let hexadecimalInteger = 0x11 // 17 十六进制标识 浮点数字

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用 传值 把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 传地址 传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象 传引用 真正的以地址的方式传递参数 传递以后,行参和实参都是同一个对象,只是他们名字不同而已 对行参的修改将影响实参的值 所谓变量是内存地址的一个抽象名字,在静态编译的程序中,所有变量名都会在编译时转换成内存地址,机器不知道变量名,只知道地址. C 语

黑马程序员——c语言学习心得—— 指针

黑马程序员——c语言学习心得—— 指针 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,打开文件fopen(文件名,打开方式);例如:FILE *fp = fopen("a1","r");  返回的是文件的指针(文件在内存缓冲区的首地址)fopen函数反回值 是指向 a1文件的指针,通常赋值给一个指针变量关于文件名a1 也可以是一个“路径+文件名”   c:\abc.txt----------------

如何理解c语言中得指针

最近有学习了c语言中得指针知识,脑袋都大了,迷迷糊糊理解了一半,由自己查了下资料,跟大家分享下c语言中指针的基本知识吧: 1.指针是一个地址,指向的是个类型. 2:指针指向的是地址,地址指向的是内容. 我们需要一个变量,来存储地址,这个变量的值是地址,但是我们可以通过修改变量的值,来不断的改变地址,但是,我们如果需要改变该个地址的值的话,就需要,对地址的值进行修改,而不改变地址. int a = 10: int *p : p = &a: *p =11: a=? 这里我们看到,p 是一个变量,我们

【C语言学习】指针再学习(二)之数组的指针

★一维数组 一个整型数据为4个字节.4个字节就是32位,即可以表示2^32个数字 在程序中定义一个数组a[5] = {1,2,3,4,5}; 那么a[0]的地址就是0x00000000,数组名a是数组首元素的地址,a的地址也是0x00000000.a+1则表示的地址是0x00000004,而不是0x00000001.因为1这个值,根据前面的指针a所指向的类型的长度来调整自己的长度.也就是说如果a是指向整型的指针,那么后面加的1也表示4个字节,如果a是指向字符型的指针,那么后面加的1表示1个字节.

iOS学习笔记---oc语言第五天

字典,数组 ,集排序 一.字典类 存储以下数据 name:张三; sex:男;age:18 film:风暴; playcount:10000次;price:60元 字典类用于保存具有映射关系(key-value对)的数据 对于“name:张三”来讲,key就是“name”,key对应的value是“张 三” 一个key-value对认为是一个元素(实体),字典是存储key-value对 的容器. 特点: 与数组不同,数组靠下标存取数据,数组的下标是唯一的. 字典靠key存取元素.key不能重复,