<深入理解C指针>学习笔记和总结 第四章 指针和数组
2014-07-19 13:55
465 查看
数组是一个什么玩意:
数组和指针我的理解,有同样之处也有不同之处。因有同样之处,因此一些资料上说,数组和指针本质是同样的。因有不同之处,因此也有一些资料上说,数组和指针是不一样的。
同样之处:
数组名字和指针名字都代表了一个地址。
如:int num[10];num是数组名。函数开辟了一个存储十个整数类型的空间,而num是他们的首地址。
int *p;
p=(int *)malloc(10*sizeof(int));类似的,p也指向了首地址。
不同之处是,num[10]中的空间位置是在栈中,而 ×p指向的空间是在堆中。
p能够指向别的地址(即p能够进行指针运算。是一个变量)可是num不能够运算,是一个常量。
一维数组与指针数组:
int num[5]={1,2,3,4,5};
引用的时候:printf("%d",num[i]);
int *num2[5]={&n1,&n2,&n3,&n4,&n5};
引用的时候:printf("%d",*num[i]);
二维数组:
int num[i][j];
能够用malloc创建数组:
int *pv=(int *)malloc (5*sizeof(int));
for(i=0;i<5;i++)
p[i]=i+1;//*(p+i)=i+1;
指针的一维数组:
int *arr[5];
int i;
for(i=0;i<5;i++)
{
arr[i]=(int *)malloc(sizeof(int));
*arr[i]=i;
}
或者:
*(arr+i)=(int *)malloc(sizeof(int));
**(arr+i)=i;
另外一种分析: (arr+i)表示数组第i个元素的地址。我们须要改动这个地址中的内容,因此用了×(arr+i)而 arr+i的内容是一个指针,指向一个内存。因此再此解引。返回的是所分配内存的位置。
二维数组的传递:
以2.c为样例。尽管是二维数组,可是 在函数中,是以一维数组来使用的。由于声明中就是一维数组。所以在子函数中无法以arr[i][j]的方式来使用数组里的内容。仅仅能用
arr+偏移量 然后解引的方式: *(arr+(i*cols)+j)
也能够动态分配二维数组:
int rows2;
int columns=5;
int **matrix=(int **)malloc(rows*sizeof(int *));//类型是二维数组。里面的每个元素是一个整形指针。
for(i=0;i<rows;i++)
{
matrix[i]=(int *)malloc(colums*sizeof(int));//每个元素都指向一个整形一维数组。
}
该方式类似于參考 字符串指针的表示方式。
代码演示样例:
1//指针数组:
#include <stdio.h>
int main(void)
{
int* num1[3];
int num2[3]={1,2,3};
int i;
for(i=0;i<3;i++)
num1[i]=&num2[i];
for(i=0;i<3;i++)
printf("%4d",*num1[i]);
putchar('\n');
return 0;
}
2/二维数组的表示:
#include <stdio.h>
void arr_initial(int *arr,int rows,int cols)
{
int i,j;
int num=1;
for(i=0;i<rows;i++)
for(j=0;j<cols;j++)
{
*( arr+(i*cols)+j)=num++;
}
}
void arr_print(int *arr,int rows,int cols)
{
int i,j;
int num=1;
for(i=0;i<rows;i++)
{for(j=0;j<cols;j++)
{
printf("%4d",*( arr+(i*cols)+j));
}
putchar('\n');
}
}
int main(void)
{
int num1[5][6];
int num2[7][8];
arr_initial(&num1[0][0],5,6);
arr_print(&num1[0][0],5,6);
arr_initial(&num2[0][0],7,8);
arr_print(&num2[0][0],7,8);
return 0;
}
数组和指针我的理解,有同样之处也有不同之处。因有同样之处,因此一些资料上说,数组和指针本质是同样的。因有不同之处,因此也有一些资料上说,数组和指针是不一样的。
同样之处:
数组名字和指针名字都代表了一个地址。
如:int num[10];num是数组名。函数开辟了一个存储十个整数类型的空间,而num是他们的首地址。
int *p;
p=(int *)malloc(10*sizeof(int));类似的,p也指向了首地址。
不同之处是,num[10]中的空间位置是在栈中,而 ×p指向的空间是在堆中。
p能够指向别的地址(即p能够进行指针运算。是一个变量)可是num不能够运算,是一个常量。
一维数组与指针数组:
int num[5]={1,2,3,4,5};
引用的时候:printf("%d",num[i]);
int *num2[5]={&n1,&n2,&n3,&n4,&n5};
引用的时候:printf("%d",*num[i]);
二维数组:
int num[i][j];
能够用malloc创建数组:
int *pv=(int *)malloc (5*sizeof(int));
for(i=0;i<5;i++)
p[i]=i+1;//*(p+i)=i+1;
指针的一维数组:
int *arr[5];
int i;
for(i=0;i<5;i++)
{
arr[i]=(int *)malloc(sizeof(int));
*arr[i]=i;
}
或者:
*(arr+i)=(int *)malloc(sizeof(int));
**(arr+i)=i;
另外一种分析: (arr+i)表示数组第i个元素的地址。我们须要改动这个地址中的内容,因此用了×(arr+i)而 arr+i的内容是一个指针,指向一个内存。因此再此解引。返回的是所分配内存的位置。
二维数组的传递:
以2.c为样例。尽管是二维数组,可是 在函数中,是以一维数组来使用的。由于声明中就是一维数组。所以在子函数中无法以arr[i][j]的方式来使用数组里的内容。仅仅能用
arr+偏移量 然后解引的方式: *(arr+(i*cols)+j)
也能够动态分配二维数组:
int rows2;
int columns=5;
int **matrix=(int **)malloc(rows*sizeof(int *));//类型是二维数组。里面的每个元素是一个整形指针。
for(i=0;i<rows;i++)
{
matrix[i]=(int *)malloc(colums*sizeof(int));//每个元素都指向一个整形一维数组。
}
该方式类似于參考 字符串指针的表示方式。
代码演示样例:
1//指针数组:
#include <stdio.h>
int main(void)
{
int* num1[3];
int num2[3]={1,2,3};
int i;
for(i=0;i<3;i++)
num1[i]=&num2[i];
for(i=0;i<3;i++)
printf("%4d",*num1[i]);
putchar('\n');
return 0;
}
2/二维数组的表示:
#include <stdio.h>
void arr_initial(int *arr,int rows,int cols)
{
int i,j;
int num=1;
for(i=0;i<rows;i++)
for(j=0;j<cols;j++)
{
*( arr+(i*cols)+j)=num++;
}
}
void arr_print(int *arr,int rows,int cols)
{
int i,j;
int num=1;
for(i=0;i<rows;i++)
{for(j=0;j<cols;j++)
{
printf("%4d",*( arr+(i*cols)+j));
}
putchar('\n');
}
}
int main(void)
{
int num1[5][6];
int num2[7][8];
arr_initial(&num1[0][0],5,6);
arr_print(&num1[0][0],5,6);
arr_initial(&num2[0][0],7,8);
arr_print(&num2[0][0],7,8);
return 0;
}
相关文章推荐
- <深入理解C指针>学习笔记和总结 第四章 指针和数组
- <深入理解C指针>学习笔记和总结 第三章 指针和函数
- <深入理解C指针>学习笔记和总结 第六章 指针和结构体
- <深入理解C指针>学习笔记和总结 第五章 指针和字符串
- <深入理解C指针>学习笔记和总结 第六章 指针和结构体 第二部分
- <深入理解C指针>学习笔记和总结 第二章 认识C指针
- <深入理解C指针>学习笔记和总结 第一章 认识C指针
- <<C语言深度剖析>>学习笔记之五:指针与数组
- <C++学习笔记>预处理功能
- C++ Primer学习笔记---第四章 数组和指针
- <编程之美>学习笔记1
- <<UNIX环境高级编程>>学习总结——第四章:文件和目录
- <mfc深入浅出>学习笔记一
- <<高级Bash脚本编程>> 学习笔记
- java 从零开始,学习笔记之基础入门<数组列表(ArrayList)>(九)
- <转>二十六个月Android学习工作总结(2013-05-02更新)
- 数组和指针 - 2【C++ Primer 学习笔记 - 第四章】
- 数组和指针 - 1【C++ Primer 学习笔记 - 第四章】
- <你必须知道的495个C语言问题>学习笔记 (一)
- <无线局域网媒体访问控制和物理层规范:汇聚无线控制技术规范>学习总结