目录:

一、指针

二、指针与数组

回到顶部

一、指针

1 内存被分为字节,每个字节有唯一地址,指针保存的是内存中的地址。

2 保存指针的变量,就叫指针变量,(保存地址)

3 声明一个指针变量

int i = 0;

int* p;//声明一个指针变量 int*指针类型

int * p;  int* p;  int *p;//这几种写法都行

4 每个指针变量能指向一种特定类型的对象。

5 指针是引用数据类型,因为本身没有保存最终数据,只是保存了数据的地址,间接的找到内存中的数据。

6 指针的用法

指针可用于参数,传递变量的地址,相当于多个函数共享内存地址(内存空间)。

7 值传递:相当于不同变量,指向不同区域

地址传递:相当于同一变量,指向同一区域

p:指针的值          &i:取i的地址

*p:指针指向的值     i:变量名

练习:

1)有两个数i = 2,j = 3使用函数调换两个数的值,在调换函数中查看i和j的值,在main函数查看调换后的值。

2)从键盘上输入5个数,使用一个函数求5个数中最大值、最小值,注意函数没有返回值。

指针也可以做为返回值,但不要返回自动变量。因为局部变量的生命周期,当函数结束,局部变量会被自动清除。

3)指针支持加整数、减整数、指针的比较和相减,但运算的单位由指针的类型决定。

#include <stdio.h>

//指针的基本使用
void test(){
int i = ;
//声明指针
int* p;
//int * p2;
//int *p3;
//赋值
p = &i;
//取值
printf("i val: %d\n",i);
printf("i address: %p\n",&i);
printf("p val: %d\n",*p);//*p指针指向的值
printf("p address: %p\n",p);//p是指针的值
} //指针可用于参数,传递变量的地址;
void test2(int* p){
printf("p->val:%d\n",*p);
*p = ;
printf("p->val:%d\n",*p);
} //练习:1)有两个数i = 2,j = 3使用函数调换两个数的值,在调换函数中查看i和j的值,在main函数查看调换后的值。
void test3(int* p1,int* p2){
printf("p1->%d,p2->%d\n",*p1,*p2);
int temp = ;
temp = *p1;
*p1 = *p2;
*p2 = temp;
printf("p1->%d,p2->%d\n",*p1,*p2);
} //2)从键盘上输入5个数,使用一个函数求5个数中最大值、最小值,注意函数没有返回值。
void test4(int size,int array[],int* maxp,int* minp){
for (int i = ; i < size; i++) {
if (array[i] > *maxp) {
*maxp = array[i];
}
if (array[i] < *minp) {
*minp = array[i];
}
}
} //指针也可以做为返回值,但不要返回自动变量(局部变量)。因为局部变量的生命周期,当函数结束,局部变量会被自动清除。解决方案,增长生命周期。
int* test5(){
static int i = ;
int* p = &i;
return p;
} //指针支持加整数、减整数
void test6(){
int array[] = {,,,,};
printf("array address:%p\n",array);
int* p = array;
printf("p address:%p\n",p);
printf("p->val:%d\n\n",*p);
//指针+1 地址+4
printf("p+1 address:%p\n",p+);
printf("p+1->val:%d\n",*(p+));
//
printf("\n*(p+1)->val:%d\n",*(p+));
printf("(*p)+1->val:%d\n\n",(*p)+);
//遍历数组
for (int i = ; i < ; i++) {
printf("p+%d->val:%d\n",i,*(p+i));
printf("array[%d]:%d\n",i,array[i]);
printf("array+%d:%d\n\n",i,*(array+i));
}
//存储空间
printf("array size:%ld\n",sizeof(array));
printf("p size:%ld\n",sizeof(p));
//赋值
int array2[] = {};
int* p2 = array2;
printf("\np address:%p\n",p);
p = p2;
printf("p address:%p\n",p); }
int main(int argc, const char * argv[])
{
test6(); // int* p = test5();
// printf("p:%p\n",p);
// printf("p->val:%d\n",*p); // test(); // int i = 10;
// int* p = &i;
// printf("i val:%d\n",i);
// test2(p);
// printf("i val:%d\n",i); // int i = 2;
// int j = 3;
// int* p1 = &i;
// int* p2 = &j;
// printf("i:%d,j:%d\n",i,j);
// test3(p1,p2);
// printf("i:%d,j:%d\n",i,j); // int num[5] = {0};
// int max = 0,min = 100;
// for (int i = 0; i < 5; i++) {
// printf("输入第%d个数:\n",i);
// scanf("%d",&num[i]);
// }
// test4(5,num,&max,&min);
// printf("max:%d\n",max);
// printf("min:%d\n",min);
return ;
}

回到顶部

二、指针与数组

1 占用空间

数组占用空间 = 数组元素占用空间*长度

指针占用空间 = 在64位系统下,固定8个字节,与指针类型无关。

2 赋值

数组是不可以修改其值,指针可以多次赋值。

作业:

1)在键盘上输入5个数,求和差积商,使用函数解决,没有返回值,在main函数中输出结果。

2)使用函数交换两个值,在main函数中输出结果。

3)在键盘上输入一个秒数,使用函数求时分秒,在main函数中输出结果。

4)在键盘上输入5个数,使用函数返回最大值,返回值的类型为指针类型。

 #include <stdio.h>
/*
1)在键盘上输入5个数,求和差积商,使用函数解决,没有返回值,在main函数中输出结果。
*/
void test1(int length,int num[],int* sum,int* cha,int* ji,int* shang){
for (int i = ; i < length; i++) {
*sum += num[i];
*cha -= num[i];
*ji *= num[i];
*shang /= num[i];
}
}
/*
2)使用函数交换两个值,在main函数中输出结果。
*/
void test2(int* p1,int* p2){
int temp = ;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
/*
3)在键盘上输入一个秒数,使用函数求时分秒,在main函数中输出结果。
*/
void test3(int miaoshu,int* h,int* minute,int* miao){
*h = miaoshu / ;
*minute = miaoshu % / ;
*miao = miaoshu % ;
}
/*
4)在键盘上输入5个数,使用函数返回最大值,返回值的类型为指针类型。
*/
int* test4(int length,int num[]){
static int max = ;
int* p = &max;
for (int i = ; i < length; i++) {
if (num[i] > max) {
*p = num[i];
}
}
return p;
}
int main(int argc, const char * argv[])
{
int num[];
for (int i =; i < ; i++) {
printf("输入第%d个数:",i+);
scanf("%d",&num[i]);
}
int* p1 = test4(,num);
printf("最大值:%d\n",*p1); // int miaoshu,hour,minute,miao;
// printf("输入秒数:");
// scanf("%d",&miaoshu);
// test3(miaoshu,&hour,&minute,&miao);
// printf("%d时%d分%d秒\n",hour,minute,miao); // int i = 2;
// int j = 3;
// test2(&i,&j);
// printf("i:%d,j:%d\n",i,j); // int num[5];
// int sum = 0,cha = 0,ji = 1,shang = 1;
// int length = 5;
// for (int i =0; i < 5; i++) {
// printf("输入第%d个数:",i+1);
// scanf("%d",&num[i]);
// }
// test1(length,num,&sum,&cha,&ji,&shang);
// printf("和:%d\n",sum);
// printf("差:%d\n",cha);
// printf("积:%d\n",ji);
// printf("商:%d\n",shang);
return ;
}

11-C语言指针的更多相关文章

  1. c语言指针疑惑[转载]

    c99的动态数组是在栈上面开辟的,而new出来的是在堆上面开辟的.栈和堆的地址是从两端相向增长的.栈很小,一般只有几十k,vc6好像是64k.堆很大,在win32的虚拟地址空间可以分配到2g的内存.栈 ...

  2. 不可或缺 Windows Native (7) - C 语言: 指针

    [源码下载] 不可或缺 Windows Native (7) - C 语言: 指针 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 指针 示例cPointer.h #i ...

  3. C语言指针类型 强制转换

    关于C语言指针类型 强制转换  引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...

  4. C语言指针【转】

    一.C语言指针的概念 在计算机中,所有的数据都是存放在存储器中的.一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细 ...

  5. 关于C语言指针的一些新认识(1)

    Technorati 标签: 指针,数组,汇编,C语言 前言 指针是C语言的精华,但我对它一直有种敬而远之的感觉,因为一个不小心就可能让你的程序陷入莫名其妙的麻烦之中.所以,在处理字符串时,我总是能用 ...

  6. C++11 shared_ptr智能指针(超级详细)

    在实际的 C++ 开发中,我们经常会遇到诸如程序运行中突然崩溃.程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当造成的.比如: 有些内存资源已经被释放,但指向它的指针并没 ...

  7. C++11 shared_ptr 智能指针 的使用,避免内存泄露

    多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...

  8. C语言指针转换为intptr_t类型

    1.前言 今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量.由于之前没有见过intptr_t这样数据类型,凭感觉认为intptr_t是int类型的指针.感觉很奇怪,为何要将一个指针 ...

  9. [转]C语言指针学习经验总结浅谈

    指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...

  10. C语言指针学习

    C语言学过好久了,对于其中的指针却没有非常明确的认识,趁着有机会来好好学习一下,总结一下学过的知识,知识来自C语言指针详解一文 一:指针的概念 指针是一个特殊的变量,里面存储的数值是内存里的一个地址. ...

随机推荐

  1. Java反射-简单应用

    为了程序更好的维护和扩展,在面向对象思维的世界里,首先是面向接口编程,然后我们应该把做什么和怎么做进行分离. 以下我将用一个开晚会的样例来演示一下,终于达到的效果是:工厂+反射+配置文件实现程序的灵活 ...

  2. CXF 的IP拦截

    非常久没有写技术文档了,今天 记录下Webserver的Ip限制吧 需求是:webserver接口能在内网訪问,可是測试平台的webserver要能够在外网訪问,这样就有了一点差别, 这个实现的比較简 ...

  3. Objective-C内存管理教程和原理剖析(四)

    初学Objective-C的朋友都有一个困惑,总觉得对Objective-C的内存管理机制琢磨不透,程 序经常内存泄漏或莫名其妙的崩溃.我在这里总结了自己对Objective-C内存管理机制的研究成果 ...

  4. 一个解析url参数方法

    function getRequestParameter(a) { var b = document.location.search || document.location.hash; if (a ...

  5. gulp使用心得

    本文假设你之前没有用过任何任务脚本(task runner)和命令行工具,一步步教你上手Gulp.不要怕,它其实很简单,我会分为五步向你介绍gulp并帮助你完成一些惊人的事情.那就直接开始吧. 第一步 ...

  6. WinSock网络编程基础(3)server

    上一篇讲的是简单的发送数据的客户端的实现.接下来讲的是如何实现收发数据服务器.这里说的服务器其实就是一个进程,它需要等待任意数量的客户端与之建立起连接,以便响应它们的请求. 服务器必须在已知的名称上监 ...

  7. 安装爬虫scrapy

    使用easy_install安装scrapy,报错 error: Setup script exited with error: command 'gcc' failed with exit stat ...

  8. mysql在查询结果中增加排序字段

    ELECT userId , () AS runRank , mostFast1 FROM user_info, ()) b WHERE mostFast1 IS NOT NULL ORDER BY ...

  9. Linux系统学习笔记之 1 基础命令

    翻看日记,看到以前自己学习Linux是的笔记来了,温故而知新乎.   文件命名规则: 1.除了/之外,所有的字符都合法. 2.有些字符最好不要用,如空格符.制表符.退格符.和@ # & ( ) ...

  10. 自增或自减例子:i++和++i的相同点和不同点

    /* Name:++i和i++的区别 Copyright: By.不懂网络 Author: Yangbin Date:2014年2月15日 02:40:27 Description:熟悉前自增或自减的 ...