C语言学习_数组与指针2

数组其实是一种变相的指针,数组名同时也是指针,eg:

CODE == &CODE[0];

数组的加法:

#include<stdio.h>

#define SIZE 4

int main(void)

{

shortdates[SIZE];

short* pti;

shortindex;

doublebills[SIZE];

double* ptf;

pti= dates;//把数组地址付给指针

ptf= bills;

printf("%23s  %10s\n", "short","double");

for(index= 0; index < SIZE; index++)

printf("pointers+ %d: %10p %10p\n", index, pti + index, ptf + index);

return0;

}

---------------------------------------------------

short          double

pointerrs + 0:     28ff0c    28fee8

pointerrs + 1:     28ff0e    28fef0

pointerrs + 2:     28ff10    28fef8

pointerrs + 3:     28ff12    28ff00

----------------------------------------------------

1.      指针的数值就是它指向的对象的对象的地址

2.      在指针前运用运算符*就可以得到该指针所指向的对象的数值

3.      对指针+1等价于对指针的值加上他所指的对象的字节的大小

Eg:

Dates + 2 == &date[2]  //相同的地址

*(dates + 2) == dates[2]   //相同的值

总结:可以用指针表示数组的每个元素,并得到每个元素的数值,从本质上说,对同一个对象有两种不同的符号表示方法。

优先级问题:

*的优先级高于+;

所以(*dates) + 2等价于*dates + 2;

函数、数组和指针

int sum(int *ar )

{

inti;

inttaotal = 0;

for(i= 0; i <10; i++)

total+= ar[i];

returntotal;

}

等价于:

int sum(int ar[] )

{

inti;

inttaotal = 0;

for(i= 0; i <10; i++)

total+= ar[i];

returntotal;

}

这段代码说明了:正如可以在指针符号中使用数组名一样,也可以在数组符号中使用指针,

下面代码是对上面的优化,可以灵活的控制变量。

int sum(int * ar, int n)

{

inti;

inttotal = 0;

for(i= 0; i < n; i++)

total+= ar[i];

returntotal;

}

无论在任何形式下,* ar都可以代替ar[];但是ar[]不一定能代替*ar。

数组和指针的不同形式解决同一个问题:

#include<stdio.h>

#define SIZE 10

int sum(int ar[ ], int n)

int main(void)

{

intmarbles[SIZE] = {20, 10, 5, 39, 4, 16, 19, 26, 31, 20};

longanswer;

answer= sum(marbles, SIZE);

printf("thetotal number of marbles is %ld.\n", answer);

printf("thesize of marbles is %u bytes.\n", sizeof marbles);

return0;

}

int sum(int ar[ ], int n)

{

inti;

inttotal = 0;

for(i= 0; i < n; i++)

total+= ar[i];

printf("thesize of ar is %u bytes.\n", sizeof ar);

returntotal;

}

用指针实现:

#include<stdio.h>

#define SIZE 10

int sum(int ar[ ], int n)

int main(void)

{

intmarbles[SIZE] = {20,10, 5, 39, 4, 16, 19, 26, 31, 20};

longanswer;

answer= sum(marbles, marbles + SIZE);

printf("thetotal number of marbles is %ld.\n", answer);

printf("thesize of marbles is %u bytes.\n", sizeof marbles);

return0;

}

int sum(int * start, int * end)

{

inttotal = 0;

while(start< end)

{

total+= *start;

start++;

}

returntotal;

}

关于对++和*运算符优先级的判断:

#include<stdio.h>

int data[2] = {100, 200};

int moredata[2] = {300, 400};

int main(void)

{

int*p1, *p2, *p3;

p1= p2 = data;

p3= moredata;

printf("*p1= %d,  *pa = %d,   *p3 = %d\n",*p1, *p2, *p3);

printf("*p1++= %d, *++p2 = %d, (*p3)++ = %d\n",*p1++, *++p2, (*p3)++);

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

return0;

}

--------------------------------------------------------------

*p1 = 100, *pa = 100,   *p3 = 300

*p1++ = 100, *++p2 = 200, (*p3)++ = 300

*p1= 200, *p2 = 200, *p3 = 301

---------------------------------------------------------------

*和++具有相同的优先级,只是*是自右向左结合的特性。

C语言学习_数组与指针2

时间: 2024-12-16 18:31:06

C语言学习_数组与指针2的相关文章

C语言学习004:数组与指针

在C语言中,字符串实际上就是字符数组,在内存中字符串"Shatner"存储的形式是这样的 由于C语言并不知道数组有多长,所以用"\0"表示字符串的结束位置,通过sizeof运算符可以取到字符串在内存中占用多少个字节 同样的字符串在下面的代码中获取的长度却不一样,你知道是什么原因么? #include <stdio.h> void SayHello(char msg[]){ printf("msg occupies: %i\n",siz

15-黑马程序员------C 语言学习笔记---数组和指针

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 四 数组和指针 01 数组名代表数组在内存中的首地址,表示的是地址信息,因此数组名可以理解为一个指针,不过数组名是一个常量,不能改变. #include <stdio.h> int main() { char nam

C语言 二维数组与指针笔记

今天分析了C语言二维数组和指针的基本理解,感觉有点懵...代码记录一下,如果有大神临幸发现哪里有误,欢迎指正~~~ #include <stdio.h> #include <stdlib.h> #include <string.h> //void func(int p[][]) //这样写等同于void func(int **p) p++移动了四个字节,(*p)++移动了四个字节,不符合二维数组规律 //{ //} //列优先输出的函数(即竖着输出) void func

C语言学习_排序_插入排序

1.插入排序 #include <stdio.h> #include <stdlib.h> #define M 100 int main(void) { int i, j, n; int a[M] = {0}; printf("input n:"); scanf("%d", &n); printf("input a:"); for(i = 1; i <= n; i++) //从a[1]开始,也就是第二个数 s

C语言学习_三分查找

三分查找: #include <stdio.h> #define M 10 int main(void) { int front, near, mid1, mid2; int n; int found; int a[M] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; front = 0; near = M - 1; found = 0; printf("input n:"); scanf("%d", &n); while(fron

C语言之不规则数组和指针

不规则数组是每一行的列数不一样的二维数组. 在了解不规则数组之前,先了解一下用复合字面量创建的二维数组.复合字面量是一种C构造,前面看起来像是类型转换操作,后面跟的是花括号括起来的初始化列表. (const int) {100} (int[3]) {1,2,3} 下面的声明把数组声明为整数指针的数组,然后用复合字面量语句块进行初始化,由此创建了数组arr. int (*(arr[])) = { (int[]) {0,1,2}, (int[]) {3,4,5}, (int[]) {6,7,8}};

C语言学习笔记--数组参数和指针参数

1. 数组参数退化为指针的意义 (1)C 语言中只会以值拷贝的方式传递参数,当向函数传递数组时,将整个数组拷贝一份传入函数导致执行效率低下,C 语言以高效作是最初的设计目标,所以这种方法是不可取的. (2)参数位于栈上,太大的数组拷贝将导致栈溢出. (3)将数组名看做常量指针,传递的是数组的首元素地址,而不是整个数组. 2. 二维数组参数 (1)二维数组参数同样存在退化的问题: 二维数组可以看做是一维数组,其中的每个元素又是一个一维数组 (2)二维数维参数中第一维的参数可以省略 ①void f(

C语言核心之数组和指针详解

寒假要开始猛刷<剑指offer>,先回顾一下C语言基础做个热身. 指针 相信大家对下面的代码不陌生: 1 int i=2; 2 int *p; 3 p=&i; 这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而是变量的地址.如上代码,指针p中保存的是整型变量i的地址信息. 接下来看如何定义一个指针,既然指针也是一个变量,那么它的定义也和其它变量一样定义:如: int *p: .'*' 是间接寻址或间接引用运算符.上例中我们还

C语言学习笔记(七) 函数指针

"函数指针"和"指针函数"是一对容易把人弄晕的概念,但我们只要把握好定语,倒也不难理解.这两个名词都是简称,"指针函数"是"返回值为指针的函数",而"函数指针"则是"指向函数的指针".这篇主要讲讲函数指针. 我们讲有int 指针,char指针,它们都是一个指针指向这个变量的实际地址.而C语言在编译函数的时候每个函数会有一个入口地址,当我们用一个指针指向这个入口地址,它就称为函数指针.有了