ran在一起,搞得自己很混乱。接下来我们细细看一看。

一、数组(数组:相同类型的元素的集合)

1、一维数组

(1)数组名及意义

数组名只有两种情况不被看做常量,sizeof(b)此时求得整个数组的整体长度(占用的总字节数)不能认为是求得指针常量的长度;&b此时求得整个数组的地址而不是指向某个常量的地址。

将src字符串拷贝到str中。

char *capacity(char *str) //给str开辟内存

{ 

  str = (char *)malloc(10*sizeof(int)); 

  if(NULL==str) 

  { 

    printf("扩容失败\n");

     return; 

  } 

return str;

}



int main()

{

   char *str[]="abc";

   char *src[10]="asdfghkjh";

   capacity(str); 

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

  { str[i]=src[i]; }

}

再看下面的操作。

 

void strcpy(char *dst,char const*str)
{ 
    while(*str) 
    {
     *dst++ == *str++; 
    }
}

这两个栗子同时也说明函数传参是把实参进行了一份临时拷贝。

数组在进行传参还应该注意尽量不要传整个数组,而是用数组名(指针)作为实参传递,这样可以提高效率,节省内存。

 2、多维数组(可以看做是一维数组的各元素里面放着(n-1)维数组,简单的说就是一维数组里面放着数组)。

int *arr[5]; 这就是指针数组的定义。他和其他数组相同只是数组元素的类型变为了指针。

谈到指针大家总会觉得很是琢磨不透,难。下面我们来慢慢了解。

  1、指针是什么?

   在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

  我们可以这样理解,先看个图

对应代码:

 

#include <stdio.h>
int main()
{
    int a = 10;//在内存中开辟一块空间
    int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
    //将a的地址存放在p变量中,p就是一个之指针变量。
    return 0;
}

 

 

 

理)。

  2、指针变量

像定义其他变量一样,比如int *a;char *c; float *c; 这些就是指针变量。(是不是还是很简单的)

  3、指针的解引用

int *a;int *b; *a = 10;对变量a解引用就是对a所指向地址处的空间进行操作,此时就把a所指向的地址处存入了整数10。 *b = *a; 此时就是把b所指向的地址处存放了a所指向地址处的内容(此处存放整数10)。

指针可以进行算术加减运算和关系运算。

  算术运算:

那你知道a+1;表示什么呢?上面数组问题谈到过,数组名在表达中代表指针,此时就是对指针加一。看下面图片

所以我们很清楚的看到,对指针加一,其实不是加一,而是加了该指针所对应的类型的字节数乘以1。减法运算与此相同(注意运算结果是不是你想要的结果,注意数组越界)。

  关系运算:

关系运算就是可以对指针进行 比较大小 例如:

 

int *a,*b;*a=1; 
*b=2;
if(a>b)
    printf("hehe");
else 
    printf("haha"); 

 

可以进行 >,<,==,>=,<= 这些运算。

很清楚的看到指针数组的数组元素都是指针,此时指针指向字符串第一个字符对应的地址。

有人说数组和指针之间有着千丝万缕的关系,有人说数组和指针没关系。那么你认为呢?

如果你经常搞混指针和数组,以及掌握的不牢固,建议多写程序去调试,看内存变化,如果你能看懂汇编代码,你不妨转到汇编去看看(可能会豁然开朗)。

 

相关文章:

  • 2021-05-23
  • 2021-11-18
  • 2021-06-27
  • 2021-07-15
猜你喜欢
  • 2021-12-17
  • 2021-08-27
  • 2021-12-19
  • 2021-06-29
  • 2022-12-23
  • 2021-04-10
  • 2021-12-01
相关资源
相似解决方案