目录:

一、指针

二、指针与数组

回到顶部

一、指针

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. 【MongoDB数据库】MongoDB 命令入门初探

    MongoDB是一款NoSql数据库,使用了"面向集合"(Collection-Oriented)原理,意思是数据被分组存储在数据集中,被称为一个集合(Collection).每一 ...

  2. .net网站开发(前端):4.MVC HtmlHelper

    通过前面三节,已经大概理解MVC是怎样运作的了.MVC的一个特点就是可以很方便地控制视图效果,数据交互也很灵活.先讲一下视图控制的,HtmlHelper,看到Help就知道它是不知疲惫的好人啦(有点像 ...

  3. 利用CSS3特性巧妙实现漂亮的DIV箭头

    DIV箭头用于表现DIV内容的指向,是使用非常普遍的一种表现形式,例如新浪微博的消息转发: 还有傲游网站的导航条: 像傲游账户上方这种箭头更需要多幅图片以表现箭头和hover的效果. 传统的实现方式都 ...

  4. 我使用过的Linux命令

    我使用过的Linux命令之tee - 重定向输出到多个文件 用途说明 在执行Linux命令时,我们可以把输出重定向到文件中,比如 ls >a.txt,这时我们就不能看到输出了,如果我们既想把输出 ...

  5. nginx args

    $args $content_length $content_type $document_root $document_uri $host $http_user_agent $http_cookie ...

  6. linux杂记(?)命令别名——alias

    linux中的命令别名--alias linux中的命令别名--alias 1. 用命令alias可以查询系统中有哪些可用的命令别名 2.添加命令别名 回车查看, 别名建立成功 3.查询命令的地址ty ...

  7. web server服务器

    使用最多的 web server服务器软件有两个:微软的信息服务器(iis),和Apache. 通俗的讲,Web服务器传送(serves)页面使浏览器可以浏览,然而应用程序服务器提供的是客户端应用程序 ...

  8. codeforces 632E. Thief in a Shop fft

    题目链接 E. Thief in a Shop time limit per test 5 seconds memory limit per test 512 megabytes input stan ...

  9. [C++]Infinite House of Pancakes——Google Code Jam 2015 Qualification Round

    Problem It’s opening night at the opera, and your friend is the prima donna (the lead female singer) ...

  10. Mysql innodb 后台的7大线程与3大内存

    A:一个master 线程(innodb 几乎在这个线程上实现有所有功能) B:一个lock 监控线程 C:一个错误监控线程 D:四个IO线程(insert buffer thread\log thr ...