目录:

一、指针

二、指针与数组

回到顶部

一、指针

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. 从ACM中删除一个已经创建的Library

    从ACM中删除一个已经创建的Library,无法通过界面操作,须要手工从DB中删除.须要删除的表记录有: RECENTUPDATE 找到字段Name等于该libraryName的那条记录删除掉 del ...

  2. UI_拖动View

    方法一 在touchesMoved中 // 获取到触摸的手指 UITouch *touch = [touches anyObject]; // 获取集合中对象 // 获取開始时的触摸点 CGPoint ...

  3. 数学之路-python计算实战(13)-机器视觉-图像增强

    指数变换的基本表达式为:y=bc(x-a)-1 当中參数b.c控制曲线的变换形状,參数a控制曲线的位置. 指数变换的作用是扩展图像的高灰度级.压缩低灰度级.能够用于亮度过高的图像 本博客全部内容是原创 ...

  4. C. Table Decorations(Codeforces Round 273)

    C. Table Decorations time limit per test 1 second memory limit per test 256 megabytes input standard ...

  5. HDU 3123-GCC(递推)

    GCC Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Subm ...

  6. 转载 LayoutInflater的inflate函数用法详解

    http://www.open-open.com/lib/view/open1328837587484.html LayoutInflater的inflate函数用法详解 LayoutInflater ...

  7. OOX 面向对象X

    OOA - Object-Oriented Analysis(面向对象分析) OOT - Object-Oriented Testing (面向对象测试) OOP - Object-Oriented ...

  8. NOPI导出Excel 自定义列名

    NOPI 做Excel 导出确实很方便 ,但是一直在用没好好研究. 在网上没找到自定义Columns的方法 ,于是乎自己就在原来的方法上简单地改改. 想用的童鞋们可以直接拿去用! /// 数据大于65 ...

  9. Ie浏览器TextBox文本未居中

    Ie浏览器TextBox文本未居中,而其他浏览器无问题时,可能原因是未设置垂直居中  vertical-align:middle

  10. python,redis简单订阅

    python连接redis import redis r =redis.Redis(host='192.168.199.11',port = 6379 ,db = 0) r.publish('chan ...