注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

又一个部落格

换过很多备忘录,不知道这本怎么样!

 
 
 

日志

 
 

数组,字符串,指针  

2010-02-02 16:28:34|  分类: c++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
申明一个一维数组
    type name[size];
    int sample[10];
数组的内存空间是连续的
不能把一个数组赋值给另外一个数组
    int a[10], b[10];
    a=b; //错误
    //下面是正确的做法
    for(i=0; i < 10; i++) a[i] = b[i];

下面这种情况会导致内存溢出  循环了100次
int crash[10], i;
for(i=0; i<100; i++) crash[i]=i;

申明一个2维数组
    int twoD[10][20];

字符串是一个 以 Null结尾的 char 类型的数组
创建一个有10个字符的字符串
    char str[11];
不需要手动的在数组后面添加null,编译器会自动添加
使用 cin 如果中间有 空格 tab 那么就不会在往下面读取
解决这个问题 我们使用
    #include <cstdio>
    gets_s(str);  //据说 gets 不安全
字符串常用函数
strcpy( ) strcpy(to, from); 拷贝 from 字符串到 to 字符串, 这个函数基本是用来给字符串赋值用的
    char s1[80], s2[80];
    strcpy(s1, "C++");
    strcpy(s2, " is power programming.");
strcat( ) strcat(s1, s2); s2 追加到 s1 后面
strcmp( ) strcmp(s1, s2); 比较s1 和 s2 如果相等 返回0,如果 s1大于s2 返回正数,相反 则返回负数
strlen( ) strlen(s); 计算字符串长度
toupper( ) 把一个字符转成大些字符

利用 字符串是 null 结尾的特性
    #include <cctype> // toupper
    
    char str[80];
    int i;
    strcpy(str, "this is a test");
    for(i=0;str[i];i++)
        str[i] = toupper(str[i]);
        
初始化一个数组
    type-specifier array_name[size] = {value-list};
    int i[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    
    char array_name[size] = “string”;
    char str[4] = "C++";
    char str[4] = {'C', '+', '+', '\0'};
    
初始化多维数组
    int sqrs[10][2] = { 1, 1,
                        2, 4,
                        3, 9,
                        4, 16,
                        5, 25,
                        6, 36,
                        7, 49,
                        8, 64,
                        9, 81,
                        10, 100 };
    或者
    int sqrs[10][2] = { {1, 1}, {2, 4}, {3, 9}, {4, 16}, {5, 25}, {6, 36}, {7, 49}, {8, 64}, {9, 81}, {10, 100} };
如果只初始化了一部分,那么剩余的部分将会被0填充

初始化一个没有长度的数组, 编译器会自动计算长度
    int nums[] = { 1, 2, 3, 4 };
    char e1[] = "www.osborne.com";
    如果是多维数组 ,第一位可以不指定
    int sqrs[][2] = { 1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81, 10, 100 };
    也可以定义多维的字符串数组
    char numbers[][80] = {{"tom","555-3322"},{"Mary","555-8976"}};
    
指针
指针就是内存地址
定义指针
    type *var-name;
    int *ip;
    float *fp;
    
& 操作符的作用是 返回一个操作数的内存地址    
ptr = &total;
* 操作符的作用是 返回一个地址所指的存放的值
val = *ptr;
有些人会问,为什么指针也会有类型,指针不是代表一个内存地址吗?没有必要明确类型啊.
这个是因为如果指针没有类型,那么在取指针所指向的值的时候,就不知道该取多少为了,比如int型的指针,编译器会去4位,double类型的指针编译器会取8位

指针和变量一样 可以强制转换
int *p ; double f; // ... p = (int *) &f;
但是强制转换回导致值的改变

通过指针赋值, 下面表示 把101赋值给 p指向的地址
*p = 101;
下面的括号是必须的,因为 ++操作符的优先级比 * 高
(*p)++;

可以对指针进行操作的操作符只有4个  ++ -- + -
假如 p是一个 int型的 指针, 指向地址 2000
那么 p++ 的地址是 2004 并不是 2001, 也可以写成 p=p+1, 如果是 long double类型的 那么就是 2008
上面提到过,数组的内存空间是连续的,那么就用 p++ 来遍历一个数组的值, 注意第三行, p=x ,x代表的就是第一个元素的地址
还有就是很重要的一点,用指针访问数组元素(*(p+1), *(p+2))速度的速度比用索引访问数组元素(x[0], x[1])速度快
    int x[] = {3,222,32323,4};
    int *p;
    p = x;
    cout << *p << '\n';
    p ++;
    cout << *p;
    char c;
    cin >> c;

用索引方式遍历一个一维数组
#include <iostream>
#include <cctype>
using namespace std;
int main() {
    int i;
    char str[80] = "This Is A Test";
    cout << "Original string: " << str << "\n";
    for(i = 0;str[i];i++) {
        if(isupper(str[i]))
            str[i] = tolower(str[i]);
        else if(islower(str[i]))
            str[i] = toupper(str[i]);
    }
    cout << "Inverted-case string: " << str;
    return 0;
}

其实指针 和 数组名称是同一个东西 看下面的这段程序
#include <iostream>
#include <cctype>
using namespace std;
int main() {
    int i;
    char str[80] = "This Is A Test";
    char *p;
    p = str;
    cout << "Original string: " << p << "\n";
    for(i = 0;p[i];i++) {
        if(isupper(p[i]))
            p[i] = tolower(p[i]);
        else if(islower(p[i]))
            p[i] = toupper(p[i]);
    }
    cout << "Inverted-case string: " << p;
    return 0;
}

用指针遍历数组 为什么可以while(*(p+i)) 这样用, 以为前面我们提到了,字符串结尾是个null
#include <iostream>
#include <cctype>
using namespace std;
int main() {
    char str[80] = "This Is A Test";
    char *p;
    p = str;
    cout << "Original string: " << p << "\n";
    int i = 0;
    while(*(p+i)){
        if(isupper(*(p+i)))
            *(p+i) = tolower(*(p+i));
        else if(islower(*(p+i)))
            *(p+i) = toupper(*(p+i));
        i++;
    }
    cout << "Inverted-case string: " << p;
    
    cin >> i;
    return 0;
}

字符串常量
char *ptr;
ptr = "Pointers add power to c++.\n";

用指针的方式翻转字符串,注意while(start < end), 指针式可以比较大小的,就是比较地址的大小
#include <iostream>
#include <cstring>
using namespace std;
int main() {
    char str[] = "this is a test";
    char *start, *end;
    int len;
    char t;

    cout << "Original: " <<str << "\n";

    len = strlen(str);
    
    start = str;
    end = &str[len -1];

    while(start < end){
        t = *start;
        *start=*end;
        *end=t;
        start++;
        end--;
    }

    cout<<"Reversed: " << str <<'\n';
    cin >> len;
    return 0;
}


指针数组
int *pi[10]; //定义
int var;
pi[2] = &var; // 赋值
*pi[2] //取值

例子
在dictionary数组最后面加了两个 "","" 元素的目的是 让循环到这个元素的时候 值为null
第二个地方时  函数 strcmp(dictionary[i][0],word) 第一个参数传进去的是指针 而不是指针的值
#include <iostream>
#include <cstring>
using namespace std;
int main() {
    char *dictionary[][2] = {
        "pencil", "A writing instrument.",
        "keyboard", "An input device.",
        "rifle", "A shoulder-fired firearm.",
        "airplane", "A fixed-wing aircaft.",
        "network", "An interconnected group of computers.",
        "",""
    };

    char word[80];
    int i;
    cout << "Enter word: ";
    cin >>word;
    
    for(i=0;*dictionary[i][0]; i++){
        if(!strcmp(dictionary[i][0],word)){
            cout << dictionary[i][1] << "\n";
            break;
        }
    }

    if(!*dictionary[i][0])
         cout <<word<<" not found.\n";

    cin >> i;
    return 0;
}

在申明指针后,没有赋值之前使用指针的话会出错,为了避免这个错误,在申请指针的时候会赋一个null(0)值
float *p = 0; // p is now a null pointer
if(p) // succeeds if p is not null
if(!p) // succeeds if p is null

指向指针的指针(指针链)
int **balance;
**balance; //取值

  评论这张
 
阅读(158)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017