指针、数组、二级指针、指针数组与字符串
2006-05-17 13:23
381 查看
先来一组指针和数组的比较
void TestForVectorAndPointer ()
{
char a[] = "abcd"; //栈中存放数组a[4],数组存放'a''b''c''d''/0'
printf("%x %s/n", a, a); // 0x0012FF24 abcd //对数组名操作
printf("%x %s/n", &a, &a); // 0x0012FF24 abcd //取数组首地址
printf("%x %s/n", a + 1, a + 1); // 0x0012FF25 //取数组次地址
printf("%x %c/n", *(a + 1), *(a + 1)); // 62 b //取第2个元素
printf("%x %c/n", a[1], a[1]); // 62 b //取第2个元素
printf("%x %s/n", &a[1], &a[1]); // 0x0012FF25 bcd //取数组次地址
// 不支持*(a++)的操作,数组名不能赋值
char* p = "abcd"; //栈中存放指针p,指向常量区的字符串"abcd"
printf("%x %s/n", p, p); // 0x0047E56C abcd //取字符串的首字符地址
printf("%x %s/n", &p, &p); // 0x0012FF20 乱码1 //取指针地址
printf("%x %s/n", p + 1, p + 1); // 0x0047E56D bcd //取字符串的次字符地址
printf("%x %c/n", *(p + 1), *(p + 1));// 62 b //取字符串的首字符
printf("%x %c/n", p[1], p[1]); // 62 b //取字符串的次字符
printf("%x %s/n", &p[1], &p[1]); // 0x0047E56D bcd //取字符串的次字符地址
printf("%x %c/n", *(++p), *(++p)); // 63 b //右结合b、63 // 慎用!p指向地址发生变化
char* pp = a; //栈中存放指针pp,指向常量区的数组a[4]
printf("%x %s/n", pp, pp); // 0x0012FF24 abcd //取数组首地址
printf("%x %s/n", &pp, &pp); // 0x0012FF1C 乱码2//取指针地址
printf("%x %s/n", pp + 1, pp + 1); // 0x0012FF25 bcd //取数组次地址
printf("%x %c/n", *(pp + 1), *(pp + 1)); // 62 b //取数组第2个元素
printf("%x %c/n", pp[1], pp[1]); // 62 b //取数组第2个元素
printf("%x %s/n", &pp[1], &pp[1]); // 0x0012FF25 bcd //取数组次地址
printf("%x %c/n", *(++pp), *(++pp)); // 63 b //右结合b、63 // 慎用!p指向地址发生变化
}
再来一组指针和数组的比较
void TestForVector2DAndPointer(void)
{
char* test[] = {"11", "222", "3333", "44444"}; // 栈中存放数组test[4],数组存放4个指针,每个指针均指向一个字符串
printf("%x %s/n", test, test); // 0x0012FF1C 乱码1 对数组名操作
printf("%x %s/n", &test, &test); // 0x0012FF1C 乱码1 数组地址
printf("%x %s/n", &(test[0]), &(test[0])); // 0x0012FF1C 乱码1 数组首元素的地址
printf("%x %s/n", test + 1, test + 1); // 0x0012FF20 乱码2 地址加法运算 + sizeof (int)
printf("%x %s/n", &test + 1, &test + 1); // 0x0012FF2C 乱码3 地址加法运算 + sizeof (test)
printf("%x %s/n", *(test + 1), *(test + 1)); // 0x0047C038 222 取数组次元素
printf("%x %s/n", test[1], test[1]); // 0x0047C038 222 取数组次元素
printf("%x %s/n", *(&test + 1), *(&test + 1)); // 0x0012FF2C 乱码3 地址加法运算
char** pTest = test; // 栈中存放二级指针pTest,指向数组test[4]
printf("%x %s/n", pTest, pTest); // 0x0012FF1C 乱码1 对数组名操作
printf("%x %s/n", &pTest, &pTest); // 0x0012FF18 乱码4 指针地址
printf("%x %s/n", &(pTest[0]), &(pTest[0])); // 0x0012FF1C 乱码1 数组首元素的地址
printf("%x %s/n", pTest + 1, pTest + 1); // 0x0012FF20 乱码2 地址加法运算 + sizeof (int)
printf("%x %s/n", &pTest + 1, &pTest + 1); // 0x0012FF1C 乱码1 数组首元素的地址
printf("%x %s/n", *(pTest + 1), *(pTest + 1)); // 0x0047C038 222 取数组次元素
printf("%x %s/n", pTest[1], pTest[1]); // 0x0047C038 222 取数组次元素
printf("%x %s/n", *(&pTest + 1), *(&pTest + 1)); //0x0012FF2C 11 地址加法运算
}
最后转来一个比较简洁的示例
http://www.cstudyhome.com/wenzhang06/ReadNews.asp?NewsID=6043
#include "stdio.h"
#include "stdlib.h"
/*test a funtion of 2 demesion char*/
main()
{
char s[3][3]={ {'1','1','1'},{'2','2','2'},{'3','3','3'} },**u;
int i,j;
u=s;
system("cls");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf(" %c ", *(*(u+i)+j) ); printf("/n");
}
}
void TestForVectorAndPointer ()
{
char a[] = "abcd"; //栈中存放数组a[4],数组存放'a''b''c''d''/0'
printf("%x %s/n", a, a); // 0x0012FF24 abcd //对数组名操作
printf("%x %s/n", &a, &a); // 0x0012FF24 abcd //取数组首地址
printf("%x %s/n", a + 1, a + 1); // 0x0012FF25 //取数组次地址
printf("%x %c/n", *(a + 1), *(a + 1)); // 62 b //取第2个元素
printf("%x %c/n", a[1], a[1]); // 62 b //取第2个元素
printf("%x %s/n", &a[1], &a[1]); // 0x0012FF25 bcd //取数组次地址
// 不支持*(a++)的操作,数组名不能赋值
char* p = "abcd"; //栈中存放指针p,指向常量区的字符串"abcd"
printf("%x %s/n", p, p); // 0x0047E56C abcd //取字符串的首字符地址
printf("%x %s/n", &p, &p); // 0x0012FF20 乱码1 //取指针地址
printf("%x %s/n", p + 1, p + 1); // 0x0047E56D bcd //取字符串的次字符地址
printf("%x %c/n", *(p + 1), *(p + 1));// 62 b //取字符串的首字符
printf("%x %c/n", p[1], p[1]); // 62 b //取字符串的次字符
printf("%x %s/n", &p[1], &p[1]); // 0x0047E56D bcd //取字符串的次字符地址
printf("%x %c/n", *(++p), *(++p)); // 63 b //右结合b、63 // 慎用!p指向地址发生变化
char* pp = a; //栈中存放指针pp,指向常量区的数组a[4]
printf("%x %s/n", pp, pp); // 0x0012FF24 abcd //取数组首地址
printf("%x %s/n", &pp, &pp); // 0x0012FF1C 乱码2//取指针地址
printf("%x %s/n", pp + 1, pp + 1); // 0x0012FF25 bcd //取数组次地址
printf("%x %c/n", *(pp + 1), *(pp + 1)); // 62 b //取数组第2个元素
printf("%x %c/n", pp[1], pp[1]); // 62 b //取数组第2个元素
printf("%x %s/n", &pp[1], &pp[1]); // 0x0012FF25 bcd //取数组次地址
printf("%x %c/n", *(++pp), *(++pp)); // 63 b //右结合b、63 // 慎用!p指向地址发生变化
}
再来一组指针和数组的比较
void TestForVector2DAndPointer(void)
{
char* test[] = {"11", "222", "3333", "44444"}; // 栈中存放数组test[4],数组存放4个指针,每个指针均指向一个字符串
printf("%x %s/n", test, test); // 0x0012FF1C 乱码1 对数组名操作
printf("%x %s/n", &test, &test); // 0x0012FF1C 乱码1 数组地址
printf("%x %s/n", &(test[0]), &(test[0])); // 0x0012FF1C 乱码1 数组首元素的地址
printf("%x %s/n", test + 1, test + 1); // 0x0012FF20 乱码2 地址加法运算 + sizeof (int)
printf("%x %s/n", &test + 1, &test + 1); // 0x0012FF2C 乱码3 地址加法运算 + sizeof (test)
printf("%x %s/n", *(test + 1), *(test + 1)); // 0x0047C038 222 取数组次元素
printf("%x %s/n", test[1], test[1]); // 0x0047C038 222 取数组次元素
printf("%x %s/n", *(&test + 1), *(&test + 1)); // 0x0012FF2C 乱码3 地址加法运算
char** pTest = test; // 栈中存放二级指针pTest,指向数组test[4]
printf("%x %s/n", pTest, pTest); // 0x0012FF1C 乱码1 对数组名操作
printf("%x %s/n", &pTest, &pTest); // 0x0012FF18 乱码4 指针地址
printf("%x %s/n", &(pTest[0]), &(pTest[0])); // 0x0012FF1C 乱码1 数组首元素的地址
printf("%x %s/n", pTest + 1, pTest + 1); // 0x0012FF20 乱码2 地址加法运算 + sizeof (int)
printf("%x %s/n", &pTest + 1, &pTest + 1); // 0x0012FF1C 乱码1 数组首元素的地址
printf("%x %s/n", *(pTest + 1), *(pTest + 1)); // 0x0047C038 222 取数组次元素
printf("%x %s/n", pTest[1], pTest[1]); // 0x0047C038 222 取数组次元素
printf("%x %s/n", *(&pTest + 1), *(&pTest + 1)); //0x0012FF2C 11 地址加法运算
}
最后转来一个比较简洁的示例
http://www.cstudyhome.com/wenzhang06/ReadNews.asp?NewsID=6043
#include "stdio.h"
#include "stdlib.h"
/*test a funtion of 2 demesion char*/
main()
{
char s[3][3]={ {'1','1','1'},{'2','2','2'},{'3','3','3'} },**u;
int i,j;
u=s;
system("cls");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf(" %c ", *(*(u+i)+j) ); printf("/n");
}
}
相关文章推荐
- 一道二级C题引发的思考-- c++函数传递指针的本质 与 字符串指针与字符数组的区别
- 指针、数组、二级指针、指针数组与字符串
- 4-18-2-二级多级指针、指针与数组、多线程并行计算、多线程队列、字符串拷贝
- C和指针之二维字符串数组用指针数组、数组指针、二级指针打印
- char a[](字符串数组)和char *a(字符串指针)区别
- 常量字符串与非常量字符串 字符数组与字符指针
- 字符串指针与字符数组(ZT)
- 字符串、字符数组、字符指针
- C语言,结构体中字符串的声明(采用字符指针还是字符数组)
- 第十六周项目二用指针玩字符串示例:任务一字符串连接的完成(用数组名作形参)
- 字符串指针与char型指针数组
- 数组 指针与字符串
- 【c进阶】mdk中字符串指针数组存储状况
- 存放字符串的指针数组相关应用
- 字符数组 字符指针 字符串常量
- Day7-指针的基础详解、二维数组、数组的几种应用、字符串的简单应用.pages
- C语言中 字符、数组、字符串、指针——学习IOS你必须了解
- C字符串数组与字符串指针
- 字符串数组 和 字符串指针 的区别
- C语言字符串指针变量与字符数组的区别